Depois de ler a consulta SQL lenta, sem saber como otimizar , ele me fez pensar no desempenho geral das consultas. Certamente, precisamos que os resultados da primeira tabela (quando outras tabelas forem unidas) sejam os menores possíveis antes da união (junções internas para esta pergunta), a fim de tornar nossas consultas um pouco mais rápidas.
Exemplo, caso isso:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Seja melhor / mais rápido que:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Minha teoria é a seguinte (talvez essa não seja a implementação correta, estou tentando me lembrar de um livro interno do SQL Server 2008 que li (MSFT Press)):
- O processador de consultas obtém primeiro a tabela esquerda (tabela1)
- Une-se à segunda tabela (tabela2) e forma um produto cartesiano antes de filtrar as linhas necessárias (se aplicável)
- Em seguida, executa as cláusulas WHERE, ORDER BY, GROUP BY e HAVING com a instrução SEELCT por último.
Portanto, se na declaração nº 1 acima, a tabela for menor, o mecanismo SQL terá menos trabalho para formar os produtos cartesianos. Então, quando você alcança a instrução where, possui um conjunto de resultados reduzido para filtrar na memória.
Eu poderia estar tão longe da realidade que é irreal. Como eu disse, é uma teoria.
Seus pensamentos?
Nota : Apenas pensei nesta questão e ainda não tive chance de executar nenhum teste.
Nota 2 : Marcado como SQL Server, pois não sei nada sobre a implementação do MySql, etc. Por favor, sinta-se à vontade para responder / comentar de qualquer maneira