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?
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.
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
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'
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.
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.
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.