J’ai des problèmes de ralentissement des performances dans une instruction de sélection SQL avec certains paramètres, pour la même requête, l’exécution de cette sélection à l’aide de sp_executesql
Cela prend deux fois plus de temps que l’inline-way.
Le problème est que dans sp_execute-way SQL Servern'utilise pas le plan d'exécution optimal. Bien que les plans soient différents, il semble que dans les deux cas, les index des tables sont utilisés correctement. Je ne comprends vraiment pas pourquoi les performances sont si différentes.
Ma requête initiale est plus complexe mais pour essayer decomprendre ce qui se passe j’ai simplifié la requête initiale en une sélection de 3 tables et 2 jointes. La principale différence est l’utilisation de Hash Match de manière optimale, je ne sais vraiment pas ce que cela signifie, mais c peut voir.
Plan optimal (match de hachage, plus de 3 secondes)
Mauvais plan (pas de correspondance de hachage, mêmes index que ci-dessus, plus de 12 secondes)
Je pense que mon problème n'est pas "le reniflage de paramètre", dans mon cas, la requête est toujours lente pour toutes les valeurs de paramètre distinctes car le plan d'exécution est toujours incorrect.
OPTION (RECOMPILE)
ne vous aide pas,sp_executesql
continue à aller lentement et en ligne prend plus de temps (parce que la requête compile toujours le plan d'exécution)Les statistiques pour les tableaux sont mises à jour
Je dois utiliser
sp_executesql
manière car il semble que les services de reporting encapsule le select danssp_executesql
appels
Est-ce que quelqu'un sait pourquoi sp_executesql
génère un plan d'exécution (incorrect) différent de celui de la requête en ligne?
MODIFIER: Les requêtes n’utilisaient pas les mêmes index, je suppose que parce que l’arbre d’exécution n’est pas le même et que sqlserver prend les index à sa guise, vous pouvez trouver en pièce jointe de nouveaux plans d’exécution pour forcer l’utilisation des mêmes index. à plus de 15 minutes (j'ai annulé) en requête lente. Je ne suis vraiment pas intéressé à exécuter cette requête spécifique plus rapidement, car je dis que ce n'est pas la vraie requête que je traite, ce que j'essaie de comprendre pourquoi les plans d’exécution sont si différents entre inline-query et sp_executesql
-question.
Y at-il une option magique dans sp_executesql
que cela fonctionne-t-il correctement? :)
Optimale
Lent
Réponses:
2 pour la réponse № 1Si j'ai bien compris, sp_executesql conserve un plan mis en cache après la première exécution. Les requêtes suivantes peuvent utiliser un plan mis en cache incorrect. Vous pouvez utiliser la commande suivante pour effacer le TOUT Cache de procédure SQL Server.
DBCC FREEPROCCACHE
http://msdn.microsoft.com/en-us/library/ms174283.aspx