Pourquoi serait à l'aide d'une table temp être plus rapide qu'une requête imbriquée?

Nous essayons d'optimiser certains de nos requêtes.

Une requête est de faire ce qui suit:

SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, (<complex subquery>) Date,
INTO [#Gadget]
FROM task t

SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID) as Client 
FROM [#Gadget]
order by CASE WHEN Date IS NULL THEN 1 ELSE 0 END , Date ASC

DROP TABLE [#Gadget]

(J'ai enlevé le complexe sous-requête. Je ne pense pas que c'est pertinent autre que d'expliquer pourquoi cette requête a été fait comme un processus en deux étapes.)

Je pensée il serait bien plus efficace de cette fusion en une seule requête à l'aide de sous-requêtes comme:

SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID)
FROM
(
    SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, (<complex subquery>) Date,
    FROM task t
) as sub    
order by CASE WHEN Date IS NULL THEN 1 ELSE 0 END , Date ASC

Ce serait donner à l'optimiseur de meilleure information pour savoir ce qui se passait et d'éviter toutes les tables temporaires. Je suppose qu'il devrait être plus rapide.

Mais il s'avère qu'il est beaucoup plus lent. 8 secondes, contre moins de 5 secondes.

Je ne peux pas savoir pourquoi ce serait le cas, toutes mes connaissances de bases de données implique que les sous-requêtes serait toujours plus rapide que d'utiliser des tables temporaires.

Ce qui me manque?

Modifier --

De ce que j'ai pu voir les plans de requête, les deux sont en grande partie identiques, sauf pour la table temporaire qui a une "Table d'Insérer" de l'opération, d'un coût de 18%.

Évidemment, comme il y a deux requêtes le coût de la Sorte en Haut N est beaucoup plus élevé dans la deuxième requête que le coût de la Sorte dans la sous-Requête de la méthode, de sorte qu'il est difficile de faire une comparaison directe des coûts.

Tout ce que je peux le voir sur les plans indiquent que la sous-requête méthode serait plus rapide.

Avez-vous comparé les plans de requête?
voir mon edit.
Avez-vous effacer la mémoire cache des données entre chaque test? Si non, qui pourraient biaiser la comparaison
En effet; plan de requête est la première chose à regarder, que vais vous dire exactement ce qu'il se passe. Aussi, la mémoire peut être un facteur; je suppose que la version combinée peut utiliser plus de mémoire, mais qu'il serait difficile de dire sans détaillée à la recherche. Aussi, pas trop applicable ici avec deux requêtes-en-un, mais si vous n'êtes pas à l'aide de SQL Server propre requête à l'optimisation de l'assistant de truc, je vous recommande de commencer, car il est généralement assez bonne.

OriginalL'auteur Mongus Pong | 2010-05-13