Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Existe-t-il une différence de performances entre CTE, sous-requête, table temporaire ou variable de table ?

SQL est un langage déclaratif et non un langage procédural. Autrement dit, vous construisez une instruction SQL pour décrire les résultats souhaités. Vous ne dites pas au moteur SQL comment faire le travail.

En règle générale, il est conseillé de laisser le moteur SQL et l'optimiseur SQL trouver le meilleur plan de requête. Le développement d'un moteur SQL nécessite de nombreuses années-personnes, alors laissez les ingénieurs faire ce qu'ils savent faire.

Bien sûr, il existe des situations où le plan de requête n'est pas optimal. Ensuite, vous souhaitez utiliser des indicateurs de requête, restructurer la requête, mettre à jour les statistiques, utiliser des tables temporaires, ajouter des index, etc. pour obtenir de meilleures performances.

Quant à votre question. Les performances des CTE et des sous-requêtes devraient, en théorie, être les mêmes puisque les deux fournissent les mêmes informations à l'optimiseur de requête. Une différence est qu'un ECU utilisé plus d'une fois peut être facilement identifié et calculé une seule fois. Les résultats pourraient ensuite être stockés et lus plusieurs fois. Malheureusement, SQL Server ne semble pas tirer parti de cette méthode d'optimisation de base (vous pourriez appeler cette élimination courante des sous-requêtes).

Les tables temporaires sont une autre affaire, car vous fournissez plus de conseils sur la façon dont la requête doit être exécutée. Une différence majeure est que l'optimiseur peut utiliser les statistiques de la table temporaire pour établir son plan de requête. Cela peut entraîner des gains de performances. De plus, si vous avez un CTE (sous-requête) compliqué qui est utilisé plus d'une fois, le stocker dans une table temporaire améliorera souvent les performances. La requête est exécutée une seule fois.

La réponse à votre question est que vous devez jouer pour obtenir les performances que vous attendez, en particulier pour les requêtes complexes exécutées régulièrement. Dans un monde idéal, l'optimiseur de requête trouverait le chemin d'exécution parfait. Bien que ce soit souvent le cas, vous pourrez peut-être trouver un moyen d'obtenir de meilleures performances.