/ / Plan d'exécution non optimal utilisant sp_executesql - sql-server, reporting-services, sp-executesql

Plan d'exécution non optimal avec sp_executesql - sql-server, reporting-services, sp-executesql

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)

entrer la description de l'image ici

Mauvais plan (pas de correspondance de hachage, mêmes index que ci-dessus, plus de 12 secondes)

entrer la description de l'image ici

  1. 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.

  2. 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)

  3. Les statistiques pour les tableaux sont mises à jour

  4. Je dois utiliser sp_executesql manière car il semble que les services de reporting encapsule le select dans sp_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 entrer la description de l'image ici

Lent entrer la description de l'image ici

Réponses:

2 pour la réponse № 1

Si 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