2009-10-21 9 views
2

quelqu'un peut-il me expliquer pourquoi cette requête prend 13 secondes:T-SQL: Pourquoi ma requête est-elle plus rapide si j'utilise une variable de table?

SELECT Table1.Location, Table2.SID, Table2.CID, Table1.VID, COUNT(*) 
FROM  Table1 INNER JOIN 
     Table2 AS ON Table1.TID = Table2.TID 
WHERE Table1.Last = Table2.Last 
GROUP BY Table1.Location, Table2.SID, Table2.CID, Table1.VID 

Et celui-ci seulement 1 seconde:

DECLARE @Test TABLE (Location INT, SID INT, CID INT, VID INT) 

INSERT INTO @Test 
SELECT Table1.Location, Table2.SID, Table2.CID, Table1.VID 
FROM  Table1 INNER JOIN 
     Table2 AS ON Table1.TID = Table2.TID 
WHERE Table1.Last = Table2.Last 

SELECT Location, SID, CID, VID, COUNT(*) 
FROM  @Test 
GROUP BY Location, SID, CID, VID 

Lorsque je retire le GROUP BY de la première requête, il faut seulement 1 seconde trop . J'essaie aussi d'écrire une sous-sélection et de grouper le résultat, mais cela prend aussi 13 secondes. Je ne comprends pas cela.

Répondre

1

GROUP BY peut effectuer mieux si vous avez un index sur chacune des colonnes du GROUP BY (soit un chacun, ou un indice combiné unique de toutes les colonnes)

La raison pour laquelle votre version temporaire fonctionne mieux est probablement parce que le GROUP BY est effectué sur un sous-ensemble beaucoup plus petit des données et donc il est rapide même sans l'index.

Votre méthode de table temporaire n'est en aucun cas la mauvaise façon de le faire. C'est l'une de ces situations où vous peser les avantages et les inconvénients de chaque méthode. Un index sur la table principale peut ralentir vos insertions/mises à jour et augmenter la taille de votre base de données. Cependant, la table temporaire peut ne pas fonctionner correctement une fois que la taille des données augmente avec le temps.

+0

Ok, merci. Je pense que le GROUP BY est exécuté après le WHERE, de sorte que la requête regroupe également le jeu de résultats plus petit. – Torben

+1

SQL pourrait le faire, il ne pouvait pas non plus. Plus il y a de «conjectures» à faire, plus il y a de chances qu'il se trompe. Par conséquent, indexer, ou filtrer les résultats au début peut l'aider dans des situations comme celle-ci. Comme l'a dit Jim G, comparez les plans d'exécution, cela vous dira exactement quelles sont les différences. –

4

Comparez les execution plans pour les deux requêtes.

+1

+1 - Comparez TOUJOURS les plans d'exécution pour toutes les requêtes avec lesquelles vous rencontrez des difficultés. –

1

Peut être la première requête que vous regroupez et comptez sur un résultat de requête plus important que dans la deuxième requête où vous travaillez avec un ensemble de données déjà plus petit. Pourrait être un problème d'indexation. Une fois le problème résolu, n'oubliez pas de vérifier à nouveau avec un jeu de résultats plus grand car la requête "worser" peut mieux fonctionner avec des jeux de données plus volumineux.

Questions connexes