AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 35596
Accepted
Mr. Ant
Mr. Ant
Asked: 2013-02-28 08:33:44 +0800 CST2013-02-28 08:33:44 +0800 CST 2013-02-28 08:33:44 +0800 CST

Uma junção é otimizada para uma cláusula where em tempo de execução?

  • 772

Quando eu escrevo uma consulta como esta...

select *
from table1 t1
join table2 t2
on t1.id = t2.id

O otimizador SQL, não tenho certeza se esse é o termo correto, traduz isso para...

select *
from table1 t1, table2 t2
where t1.id = t2.id

Essencialmente, a instrução Join no SQL Server é apenas uma maneira mais fácil de escrever sql? Ou é realmente usado em tempo de execução?

Editar: quase sempre, e quase sempre, uso a sintaxe Join. Estou apenas curioso para saber o que acontece.

sql-server t-sql
  • 4 4 respostas
  • 2204 Views

4 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2013-02-28T08:37:28+08:002013-02-28T08:37:28+08:00

    Esses geralmente entrarão em colapso para a mesma coisa internamente. O primeiro é aquele que você sempre deve escrever , IMHO. Mais importante, por que isso importa? Eles são idênticos em termos de plano de execução e desempenho (supondo que você não estrague tudo, o que é mais fácil de fazer com a sintaxe antiga e preguiçosa).

    Aqui está a prova usando o AdventureWorks de que não existe CROSS JOINe está filteracontecendo.


    A junção explícita:

    insira a descrição da imagem aqui


    A junção implícita:

    insira a descrição da imagem aqui


    Olha, mãe! Planos idênticos, resultados idênticos, sem junções cruzadas ou filtros vistos em qualquer lugar.

    (Para maior clareza, o aviso no SELECToperador em ambos os casos é uma conversão implícita que afeta a cardinalidade, nada a ver com a junção em nenhum dos casos.)

    • 21
  2. Paul White
    2013-02-28T18:02:26+08:002013-02-28T18:02:26+08:00

    Estritamente falando, há uma diferença na entrada para o otimizador de consulta entre os dois formulários:

    -- Input tree (ISO-89)
    SELECT
        p.Name,
        Total = SUM(inv.Quantity)
    FROM 
        Production.Product AS p,
        Production.ProductInventory AS inv
    WHERE
        inv.ProductID = p.ProductID
    GROUP BY
        p.Name
    OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 3604);
    

    Árvore de entrada ISO-89

    -- Input tree (ISO-92)
    SELECT
        p.Name,
        Total = SUM(inv.Quantity)
    FROM Production.Product AS p
    JOIN Production.ProductInventory AS inv ON
        inv.ProductID = p.ProductID
    GROUP BY
        p.Name
    OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 3604);
    

    Árvore de entrada ISO-92

    Como você pode ver, o ONpredicado da cláusula está fortemente vinculado à junção usando a sintaxe moderna. Com a sintaxe mais antiga, há uma junção cruzada lógica seguida por uma seleção relacional (um filtro de linha).

    O otimizador de consulta quase sempre recolhe a seleção relacional na junção durante a otimização, o que significa que os dois formulários provavelmente produzirão planos de consulta equivalentes, mas não há garantia real.

    • 21
  3. Kenneth Fisher
    2013-02-28T08:50:40+08:002013-02-28T08:50:40+08:00

    OK, eu estava curioso, então fiz um teste. Eu tenho planos de execução reais para o seguinte.

    select * 
    from sys.database_principals prin, sys.database_permissions perm
    WHERE prin.principal_id = perm.grantee_principal_id
    

    e

    select * 
    from sys.database_principals prin
    JOIN sys.database_permissions perm
        ON prin.principal_id = perm.grantee_principal_id
    

    Eu os comparei objeto por objeto e eles eram idênticos. Então, pelo menos para um exemplo muito simples, eles chegaram à mesma coisa. Eu também verifiquei as estatísticas IO e tempo e eles estavam próximos o suficiente para ser a mesma coisa.

    Dito isto, você deve usar a JOINsintaxe porque é mais fácil de ler e é menos provável que você cometa erros, principalmente em consultas complicadas. E a sintaxe *=/ para junções já foi removida a partir do SQL-Server 2005.=*OUTER

    • 4
  4. DaniSQL
    2013-02-28T11:35:22+08:002013-02-28T11:35:22+08:00

    Para junção interna, eles são intercambiáveis, mas para junções externas, eles têm significados diferentes - o ON é correspondente e o WHERE é uma filtragem simples. Portanto, é melhor manter a correspondência de sintaxe JOIN correta no ON.

    • 4

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve