2010-11-25 28 views
7

J'ai deux requêtes SQL avec environ 2-3 INNER JOINS chacun. Je dois faire un INTERSECT entre eux.Option Recompile rend la requête rapide - bonne ou mauvaise?

Le problème est que les requêtes fonctionnent individuellement, mais après l'intersection prennent environ 4 secondes au total.

Maintenant, si je mets une OPTION (RECOMPILE) à la fin de cette requête entière, la requête fonctionne à nouveau très vite, fonctionnant assez rapidement et retournant presque instantanément !. Je comprends que recopile option force une reconstruction du plan d'exécution, donc je suis confus maintenant si ma requête earler prenant 4 secondes est meilleure ou maintenant celle avec recompiler, mais en prenant 0 secondes, c'est mieux.

Répondre

5

Plutôt que de répondre à la question que vous avez posée, voici ce que vous devez faire:

Mettez à jour vos statistiques:

EXEC sp_updatestats 

Si cela ne fonctionne pas, reconstruire les index.

Si cela ne fonctionne pas, regardez OPTIMIZE FOR

+1

Est-il exécuté périodiquement? Sinon, je ne sais pas comment gérer l'index dans ma base de données ... Des idées sur la façon d'éviter le besoin d'exécuter cette commande périodiquement? Ou si ce n'est pas possible, faites-vous la meilleure façon de l'exécuter périodiquement, je veux dire sans avoir besoin de l'application pour le faire? –

+0

Je vous suggère de poser une question distincte. –

5

WITH RECOMPILE est spécifié SQL Server ne met pas en cache un plan pour cette procédure stockée, la procédure stockée est recompilée chaque fois qu'elle est exécutée. Chaque fois qu'une procédure stockée est exécutée dans SQL Server pour la première fois, elle est optimisée et un plan de requête est compilé et mis en cache dans la mémoire de SQL Server. Chaque fois que la même procédure stockée est exécutée après sa mise en cache, elle utilise le même plan de requête, ce qui élimine le besoin d'optimiser et de compiler la même procédure stockée chaque fois qu'elle est exécutée. Ainsi, si vous devez exécuter la même procédure stockée 1 000 fois par jour, vous pouvez économiser beaucoup de temps et de ressources matérielles et SQL Server n'a pas besoin de travailler aussi fort.

vous ne devriez pas utiliser cette option car en utilisant cette option, vous perdez la plupart des avantages que vous obtenez en substituant des requêtes SQL aux procédures stockées.

+3

Mais pour l'OP, en évitant cette option signifie que SQL Server passe 100-200 fois plus à chaque fois que la requête est exécuté et gaspille probablement beaucoup de CPU et le disque le débit car il utilise toujours un mauvais plan de requête. À moins de trouver un moyen de faire en sorte que SQL Server mette en cache un bon plan, alors OPTION (RECOMPILE) est beaucoup, beaucoup mieux parce que le temps de génération/optimisation du plan est microscopique par rapport au temps d'exécution du mauvais plan ... – binki