MODIFIER:
S'il vous plaît voir les commentaires de Martin ci-dessous:
Le CTE n'est pas matérialisé sous la forme d'une table en mémoire. C'est juste une façon d'encapsuler une définition de requête. Dans le cas du PO, ce sera en ligne et comme si vous veniez de le faire SELECT Column1, Column2, Column3 FROM SomeTable
. La plupart du temps, ils ne se matérialisent pas à l’avance. C’est pourquoi nous ne renvoyons aucune ligne WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
et vérifions également les plans d’exécution. Bien qu'il soit parfois possible de pirater le plan pour obtenir une bobine. Un élément de connexion demande un indice pour cela. - Martin Smith 15 février 12 à 17:08
Réponse originale
CTE
En savoir plus sur MSDN
Un CTE crée la table utilisée en mémoire, mais n'est valide que pour la requête spécifique qui la suit. Lorsque vous utilisez la récursivité, cela peut être une structure efficace.
Vous pouvez également envisager d'utiliser une variable de table. Ceci est utilisé comme une table temporaire et peut être utilisé plusieurs fois sans avoir besoin d'être re-matérialisé pour chaque jointure. En outre, si vous devez conserver quelques enregistrements maintenant, ajoutez quelques enregistrements supplémentaires après la sélection suivante, ajoutez quelques enregistrements supplémentaires après une autre opération, puis renvoyez uniquement ces quelques enregistrements. Cette structure peut donc être pratique. pas besoin d'être abandonné après l'exécution. Surtout juste du sucre syntaxique. Toutefois, si vous maintenez un nombre de lignes faible, il ne se matérialise jamais sur le disque. Voir Quelle est la différence entre une table temporaire et une variable de table dans SQL Server? pour plus de détails.
Table temporaire
En savoir plus sur MSDN - Faites défiler environ 40% du chemin
Une table temporaire est littéralement une table créée sur le disque, mais dans une base de données spécifique pouvant être supprimée par tous. Il incombe à un bon développeur de détruire ces tables lorsqu'elles ne sont plus nécessaires, mais un administrateur de base de données peut également les effacer.
Les tables temporaires sont de deux types: locale et globale. En termes de serveur MS SQL, vous utilisez une #tableName
désignation pour local et une ##tableName
désignation pour global (notez l'utilisation d'un simple ou d'un double # comme caractéristique d'identification).
Notez qu'avec les tables temporaires, par opposition aux variables de table ou au CTE, vous pouvez appliquer des index, etc., car il s'agit légitimement de tables au sens normal du terme.
En général, j'utilisais des tables temporaires pour les requêtes plus longues ou plus longues, ainsi que des CTE ou des variables de table si j'avais déjà un petit jeu de données et si je voulais simplement écrire rapidement un peu de code pour quelque chose de petit. L’expérience et les conseils d’autres personnes indiquent que vous devez utiliser des CTE pour lesquels vous ne recevez qu’un petit nombre de lignes. Si vous avez un grand nombre, vous bénéficierez probablement de la possibilité d'indexer sur la table temporaire.