2012-09-19 4 views
1

Ne fait unun « SELECT * FROM (SELECT ... » créer une table temporaire?

SELECT * FROM (SELECT foo.id, bar.name FROM foo LEFT JOIN bar ON bar.foo_id = foo.id) 
       \--------------- Will this be a temp table? --------------------------/ 

créer le même type de table temporaire comme la déclaration d'une table aveC# fait dans une procédure stockée? Ou t-il créer une vue ou peut-être une autre magie? une recherche rapide sur les tables temporaires ne leur a montré être utilisés dans des procédures stockées.

+0

Peut-être. Comment cela vous aide-t-il si c'est le cas? Comment cela vous aide-t-il si ce n'est pas le cas? –

+0

@Damien_The_Unbeliver: J'ai une assez grande requête qui utilise ceci et voulait comprendre ce qui se passe sous le capot. – inquam

Répondre

1

il ne oui, mais uniquement en interne.

vous ne pas avoir accès à Après l'exécution de la requête entière,

0

Dans votre exemple, la requête externe ne fait rien. L'optimiseur de requêtes l'optimisera donc.

Vous pouvez voir le flux des ensembles de résultats dans le plan d'exécution de la requête. Par exemple, un loop join génère une structure temporaire qui contient les lignes résultantes. La structure temporaire pourrait être stockée dans tempdb un peu comme une table temporaire. Mais il ne sera pas visible pour vous, et il sera désalloué une fois la requête terminée.

+0

La requête actuelle est un peu plus complexe et en fait beaucoup plus, donc il était peut-être stupide d'utiliser une requête aussi simple qui sera optimisée comme ça :). Je voulais juste savoir si la partie entre parenthèses serait traitée comme une table temporaire. – inquam

+1

Une façon de dire est d'examiner le plan d'exécution de la requête. Certaines sous-requêtes peuvent être exécutées ligne par ligne. Ceux-ci ne nécessitent pas de stockage temporaire. – Andomar

1

La table temporaire sera créée en mémoire puis, comme indiqué, perdue. Pour les sous-requêtes complexes, cela mettra évidemment un peu de pression sur la mémoire, mais comme pour la plupart des choses, la mémoire est plus rapide que le disque.

Vous pouvez faire des requêtes imbriquées en tant que requêtes individuelles, en utilisant une table temporaire (sur le disque) pour ensuite exécuter une autre requête, en fin de compte, en supprimant la table.

Questions connexes