2010-08-04 6 views
1

J'écris une procédure stockée sur SQL Server 2000.
J'ai écrit une instruction select compliquée qui prend 18 secondes pour s'exécuter.
La question est, comment puis-je auto-rejoindre le résultat correctement et efficacement?Comment utiliser le résultat d'une requête compliquée en auto-jointure?

Est-il possible de le gérer dans une seule instruction select sans répéter la grande requête que j'ai actuellement? Ou devrais-je enregistrer le résultat dans une variable de table ou une table temporaire?
Merci beaucoup.

Répondre

4

Si la requête d'origine s'exécute longtemps, mais le résultat est petit, oui, vous pouvez envisager une table temporaire/helper, et exécutez votre deuxième requête (la jointure automatique) sur cette table. Ceci peut également aider à maintenir votre approche modulaire/maintenable. Et vous serez en mesure d'ajuster les performances sur cette requête de longue durée sans que votre deuxième vous regarde dans le visage entre-temps.

+0

La requête d'origine s'exécute lentement et le résultat est actuellement d'environ 4000 enregistrements. Est-ce petit ou grand? Y at-il la grammaire permettant d'obtenir le résultat de la requête dans une variable de table? Ou dois-je utiliser une table temporaire? – phoenies

+0

Pour 4000 enregistrements, une table temporaire peut être la meilleure option de toute façon. Aucune statistique n'est conservée sur les variables de table et l'optimiseur suppose toujours qu'il contiendra une ligne, ce qui peut conduire à de mauvaises stratégies de jointure. –

+0

phoenies, si vous voulez étudier plus loin, regardez OPENROWSET/Insérer dans ... EXEC (http://stackoverflow.com/questions/653714/how-to-select-into-temp-table-from-stored-procedure), ou une description plus détaillée des alternatives à http://databases.aspfaq.com/database/should-i-use-a-temp-table-or-a-table-variable.html – Tobiasopdenbrouw

Questions connexes