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 / 1650
Accepted
kacalapy
kacalapy
Asked: 2011-03-10 08:33:03 +0800 CST2011-03-10 08:33:03 +0800 CST 2011-03-10 08:33:03 +0800 CST

Subconsultas ou junções?

  • 772

O que é melhor em termos de eficiência do servidor SQL; usar subconsultas ou junções?

Eu sei que as subconsultas não correlacionadas são melhores do que as subconsultas correlacionadas. Mas e as junções?

O SQL se torna mais legível e compreensível usando junções

OUTER JOIN and check for NULLS

mas é pior ou melhor para desempenho do DB?

sql-server sql-server-2005
  • 3 3 respostas
  • 1036 Views

3 respostas

  • Voted
  1. Best Answer
    gbn
    2011-03-10T12:46:11+08:002011-03-10T12:46:11+08:00

    Tomando seus exemplos, normalmente são consultas diferentes se c2 for filho de c1 (também conhecido como muitas linhas em c2 por linha em c1). Qual é o caso usual, a menos que você tenha apenas relacionamentos 1:1.

    select c1 from t1 join t2 on c1 = c2
    
    select c1 from t1 where c1 in (select c2 from t2)
    
    • O primeiro dará uma linha para cada partida
    • O segundo fornece apenas valores c1 exclusivos.

    Para torná-los iguais, você precisaria de DISTINCT no primeiro: o que não o torna mais legível.

    Indo além, o segundo pode ser expresso como

    select c1 from t1
    INTERSECT
    select c2 from t2
    
    select c1 from t1 where EXISTS (select * from t2 WHERE t1.c1 = t2.c2))
    

    Ou seja: IN, EXISTS e INTERSECT dão os mesmos resultados.

    Agora, também podemos cobrir o caso inverso, já que você perguntou sobre LEFT JOINs. Aqui temos NOT IN, NOT EXISTS, LEFT JOIN e EXCEPT.

    Digamos que queremos linhas de t1 sem linhas em t2 onde t2.c3 = 'foo'

    select c1 from t1 left join t2 on t1.c1 = t2.c2 AND t2.c3 = 'foo'
    WHERE t2.c2 IS NULL
    
    select c1 from t1 where c1 NOT in (select c2 from t2 where t2.c3 = 'foo')
    
    select c1 from t1
    EXCEPT
    select c2 from t2 where t2.c3 = 'foo'
    
    select c1 from t1 where NOT EXISTS
            (select * from t2 WHERE t1.c1 = t2.c2 AND t2.c3 = 'foo')
    

    Neste caso, apenas EXCEPT e NOT EXISTS estão sempre corretos. NOT IN falhará em t2.c2 é sempre NULL. E você precisa de DISTINCT no LEFT JOIN.

    Observe também que o filtro LEFT JOIN está na cláusula ON. Para remover isso, você precisa de uma tabela derivada ou um CTE.

    Eu também diria que as subconsultas hoje em dia não importam muito, dada a sofisticação dos otimizadores de consulta (a menos que sejam abusadas, é claro)

    Pessoalmente, quase sempre uso EXISTS e NOT EXISTS (talvez INTERSECT ou EXCEPT para maior clareza), então meu código é consistente e funciona em todos os casos. Não preciso me preocupar em transformar um LEFT JOIN em um INNER JOIN ou NULLs em um NOT IN.

    • 6
  2. Justin Cave
    2011-03-10T12:23:55+08:002011-03-10T12:23:55+08:00

    Se o SQL for mais legível e compreensível se você usar junções, use junções, a menos que tenha um forte motivo para fazer o contrário. Da mesma forma, se o SQL for mais legível e compreensível usando subconsultas, use subconsultas, a menos que você tenha um forte motivo para fazer o contrário. Diferentes consultas são mais facilmente expressas usando uma construção ou outra, não é um tamanho único para todas as situações.

    Eu só consideraria usar a opção menos legível se você achar que a opção mais legível não é eficiente o suficiente. O SQL Server, como a maioria dos bancos de dados relacionais, pode frequentemente transformar uma instrução que usa subconsultas em outra que usa junções. Portanto, frequentemente não há diferença nos planos de consulta.

    • 1
  3. DBA-K
    2011-12-03T16:00:16+08:002011-12-03T16:00:16+08:00

    Prefiro utilizar JOINs em vez de subconsultas, especialmente para consultas simples, mas uma vez que a sofisticação ou complexidade da consulta atinge um certo ponto, normalmente a dividirei e usarei subconsultas.

    JOINs simples são fáceis de criar, especialmente se você tiver acesso ao esquema do banco de dados. As subconsultas também podem ser fáceis, mas bastante demoradas e é mais fácil olhar para uma subconsulta e dividi-la para analisar o que está realizando.

    • 1

relate perguntas

  • 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

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve