De msdn :
Contrairement à une table dérivée, un CTE peut être auto-référencé et peut être référencé plusieurs fois dans la même requête.
J'utilise beaucoup les CTE, mais je n'ai jamais vraiment réfléchi aux avantages de les utiliser.
Si je référence plusieurs fois un CTE dans la même requête:
- Y a-t-il un avantage en termes de performances?
- Si je fais une auto-jointure, SQL Server analysera-t-il les tables cibles deux fois?
sql-server
cte
Royi Namir
la source
la source
Réponses:
En règle générale, un CTE n'améliorera JAMAIS les performances .
Un CTE est essentiellement une vue jetable. Il n'y a pas de statistiques supplémentaires stockées, pas d'index, etc. Il fonctionne comme un raccourci pour une sous-requête.
À mon avis, ils peuvent être FACILEMENT surutilisés (je vois beaucoup de surutilisation dans le code dans mon travail). Vous trouverez ici de bonnes réponses, mais si vous devez faire référence à quelque chose plusieurs fois, ou s'il s'agit de plus de quelques centaines de milliers de lignes, placez-le dans un
#temp
tableau à la place et indexez-le.la source
CTE
est un mauvais choix car les résultats sont ignorés après la première requête.Outre la récursivité, je trouve que les CTE sont extrêmement utiles lors de la création de requêtes de rapports complexes. J'utilise une série de CTE pour obtenir des morceaux des données dont j'ai besoin, puis je les combine dans la sélection finale. Je trouve qu'ils sont plus faciles à maintenir que de faire la même chose avec beaucoup de tables dérivées ou 20 jointures et je trouve que je peux être plus sûr qu'il renvoie les données correctes sans effet de plusieurs enregistrements en raison des relations un-plusieurs dans toutes les différentes jointures. Permettez-moi de donner un exemple rapide:
Donc, en séparant les différents morceaux d'informations que vous souhaitez, vous pouvez vérifier chaque partie individuellement (en utilisant les sélections commentées, en décommentant chacune individuellement et en ne l'exécutant que dans la mesure sélectionnée) et si vous avez besoin de modifier les dépenses calcul (dans cet exemple), il est plus facile à trouver que lorsqu'ils sont tous mélangés en une seule requête massive. Bien sûr, les requêtes de rapport réelles pour lesquelles j'utilise ceci sont généralement beaucoup plus compliquées que l'exemple.
la source
Comme toujours, cela dépend mais il y a des cas où les performances sont grandement améliorées. Je le vois avec les instructions INSERT INTO SELECT où vous utilisez un CTE pour la sélection, puis utilisez-le dans INSERT INTO. Cela peut être dû au fait que RCSI est activé pour la base de données, mais pour les moments où très peu est sélectionné, cela peut aider un peu.
la source