2010-06-24 11 views
1

Tenir compte de l'instruction SQL suivante (SQL Server 2008):Comment l'instruction WITH stocke-t-elle l'ensemble d'enregistrements pour la requête de sélection?

WITH MyResult AS 
(
    SELECT 
    Name, 
    Row_ID AS ORD 
    FROM Person Where Gender = @Gender 
) 
SELECT * 
FROM MyResult 
WHERE ORD > 5 

est-MonRésultat stockées dans une table temporaire dans le tempdb? Ou fait-il quelque chose d'autre?

Nous optimisons des requêtes et lke pour mieux comprendre avec les déclarations (interne) pour améliorer les performances de calibre, etc.

Merci de

Répondre

2

Non, selon this MSDN article

... la CTE est une construction au niveau de la langue, ce qui signifie que SQL Server ne crée pas en interne des tables temporaires ou virtuelles ...

Et aussi, as mentioned here:

Une expression de table commune (CTE) peut être considéré comme un résultat temporaire établi qui est défini dans l'exécution portée d'un seul SELECT, INSERT, MISE À JOUR , DELETE ou CREATE VIEW instruction. Un CTE est similaire à une table dérivée en ce sens qu'il n'est pas stocké en tant qu'objet et dure uniquement pour la durée de la requête.

+0

« ... un ensemble temporaire de résultat ... » déclenché notre façon de penser qu'un ensemble temporaire de résultat est stocké quelque part temporairement (c.-à-tempdb.) – Russell

+0

@Russell - Oui, je peux voir où le libellé est un peu nuageux sur ce. En utilisant un CTE en lui-même, SQL Server ne crée pas de table temporaire. Bien sûr, comme toute requête, CTE ou sans CTE, il pourrait être renvoyé à tempdb en fonction de ce qui se passe. Mais ce n'est pas spécifique aux CTE – AdaTheDev