Dada esta consulta,
SELECT a.*
FROM a
LEFT JOIN b ON b.a_id = a.id
LEFT JOIN c ON c.a_id = a.id
HAVING COUNT(DISTINCT b.id) < COUNT(DISTINCT c.id)
se b for uma tabela significativamente maior que c, haverá implicações de desempenho na ordem em que faço as uniões? Li em algum lugar que a regra geral é unir o menor ao maior, mas isso pode estar se referindo a INNER JOINs.
Percebo que os resultados dependerão da ordem das junções externas em muitos cenários, mas em um como o acima, em que a ordem não importa para a veracidade, isso provavelmente afetará o desempenho?
SQL é uma linguagem declarativa, a consulta não é executada da maneira que você a escreve. A maioria dos RDMS modernos possui um otimizador decente que é capaz de escolher a ordem de junção correta quando um número relativamente pequeno de tabelas está envolvido, as estatísticas estão atualizadas, os dados não são distorcidos, existem índices apropriados, etc.
A otimização de consulta é um tópico muito amplo e bastante específico para determinado fornecedor. Pode envolver adicionar dicas, criar visualizações materializadas, usar planos de execução fixos, armazenar tabelas em cache na memória e muitas outras coisas. Até certo ponto, você pode controlar a ordem de junção com a maneira como escreve a consulta (por exemplo,
WITH
é mais provável que a subconsulta interna seja executada primeiro em comparação com a mesma subconsulta na exibição inline, mas, novamente, é muito específico para o RDMS que você está usando.Como regra geral, recomendo começar com uma consulta que forneça os resultados esperados e tentar otimizá-la apenas se for lenta - o otimizador fará o resto.
Nota lateral:
COUNT
pode aparecer naHAVING
cláusula, não emWHERE
; a consulta falhará na maioria dos RDMS.