Après avoir lu la requête Slow SQL, je ne sais pas comment l'optimiser , cela m'a fait penser aux performances générales des requêtes. Certes, nous avons besoin que les résultats de la première table (lorsque d'autres tables sont jointes) soient aussi petits que possible avant de se joindre (jointures internes pour cette question) afin de rendre nos requêtes un tout petit peu plus rapides.
Exemple, devrait-il:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Soyez meilleur / plus rapide que:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Ma théorie est la suivante (ce n'est peut-être pas la mise en œuvre correcte, j'essaie de me souvenir d'un livre interne de SQL Server 2008 que j'ai lu (MSFT Press)):
- Le processeur de requêtes obtient d'abord la table de gauche (table1)
- Joint la deuxième table (table2) et forme un produit cartésien avant de filtrer les lignes nécessaires (le cas échéant)
- Exécute ensuite les clauses WHERE, ORDER BY, GROUP BY, HAVING avec la dernière instruction SEELCT.
Donc, si dans l'instruction # 1 ci-dessus, la table est plus petite, le moteur SQL a moins de travail à faire lors de la formation des produits cartésiens. Ensuite, lorsque vous atteignez l'instruction where, vous disposez d'un jeu de résultats réduit à partir duquel filtrer en mémoire.
Je pourrais être si loin de la marque que c'est irréel. Comme je l'ai dit, c'est une théorie.
Tes pensées?
Remarque : Je viens juste de penser à cette question et je n'ai pas encore eu l'occasion de faire des tests moi-même.
Note 2 : Tagué comme SQL Server car je ne sais rien de l'implémentation de MySql etc. N'hésitez pas à répondre / commenter quand même
la source