Réexécutez un plan de requête réel spécifique

7

J'ai capturé un plan de requête réel pour une requête spécifique.

Après cela, j'ai changé quelques éléments (y compris la mise à jour des statistiques) et relancé cette requête spécifique. Maintenant, le plan de requête réel est différent (ce qui est logique).

La requête s'exécute désormais beaucoup plus rapidement. Je suis curieux de savoir si le nouveau plan d'exécution a quelque chose à voir avec cela, car d'autres modifications (modifications de la configuration des E / S, des paramètres de la machine virtuelle, redémarrage de l'instance SQL, etc.) peuvent également être à l'origine de l'amélioration des performances. Pour tester cela, je voudrais réexécuter la requête et essayer de forcer SQL Server à utiliser l'ancien plan d'exécution.

Question : existe-t-il un moyen de réexécuter une requête avec un plan d'exécution fourni par l'utilisateur, ou même d'exécuter une requête directement à partir d'un tel plan?

Voici ce que j'ai essayé de comprendre celui-ci:

Bref, est-ce possible? Si c'est le cas, comment?

Jeroen
la source
J'ai utilisé les éléments suivants pour vérifier les requêtes longues et courtes sur mes systèmes de développement et de test. Effacez ensuite les plans, tampons et caches existants et exécutez la ou les requêtes avec la trace activée. Utilisation des fonctions dbcc drop / free pour effacer la session, le cache, les tampons, etc. et désactiver ou désactiver la trace. Indépendant mais utile, est de voir quel est le problème avec les données dans le tableau. Veuillez noter que j'ai vu que vous utilisiez S2K12, donc ces références devraient correspondre. Le comportement peut différer dans les versions antérieures de Sql Server. J'espère que cela t'aides. DBCC FREESYSTEMCACHE, DROPCLEANBUFFERS, Trace On, show_statistics, etc.
Ray Porrata

Réponses:

10

Oui.

Vous avez besoin de l' USE PLANindice.

Dans lequel vous fournissez le XMLdu premier plan.

SELECT *
FROM T
OPTION (USE PLAN N'<?xml version="1.0" encoding="utf-16"?> ....')

Bien qu'il ne garantisse pas que le plan sera exactement le même (par exemple, les opérateurs scalaires de calcul peuvent se déplacer par exemple), il sera probablement assez proche.

Martin Smith
la source
Merci, exactement ce que je demandais. (Malheureusement, cela me laisse avec un nouveau problème: " Un plan de requête est introuvable car l'optimiseur a dépassé le nombre d'opérations autorisées lors de la recherche du plan spécifié dans l'indication USE PLAN. ", Mais c'est un autre problème à résoudre, je suppose.)
Jeroen
@Jeroen - Hmmm. Je ne sais pas s'il y a du travail pour cela. Il y a peut-être un indicateur de trace qui augmenterait cette limite, mais s'il y en a je ne le sais pas!
Martin Smith
Pas de problème, merci pour votre aide en tout cas: appris quelque chose de nouveau aujourd'hui! : D
Jeroen
@Jeroen - Peut-être TF 8780 non documenté qui désactive les délais d'attente de l'optimiseur ? Je ne sais pas si cela aurait l'effet souhaité.
Martin Smith