Contournement des paramètres

8

J'ai utilisé deux méthodes pour contourner les problèmes de détection de paramètres dans le passé:

1) Utiliser WITH RECOMPILE
2) Réaffecter les valeurs des paramètres aux variables locales et les utiliser à la place des paramètres

D'après ce que je comprends, le résultat final des deux est le même - un nouveau plan d'exécution optimisé pour la requête / les paramètres actuels est créé et utilisé.

Si cela est vrai, existe-t-il des différences entre ces deux méthodes ou sont-elles essentiellement les mêmes? Est-ce que l'un est préférable à l'autre?

Abe Miessler
la source

Réponses:

3

Si vous pouvez anticiper des valeurs typiques, exécutez votre procédure stockée avec ces valeurs chaque fois que vous la (recréez). Un plan d'exécution sera créé sur la base de ces valeurs et stocké pour une utilisation future. La plupart de mes .sqlfichiers de procédures stockées se terminent par une EXECcommande avec des valeurs raisonnables, dans ce but précis (cela, et pour identifier les erreurs de base dans le code).

Bien sûr, cela n'aidera pas si votre procédure stockée est très longue, suffisamment pour que vous ne puissiez pas raisonnablement l'exécuter pendant les heures de production. Notez qu'il ne suffit pas de démarrer le travail, il doit se terminer avec succès pour qu'un plan soit stocké.

Jon de tous les métiers
la source
4
  1. WITH RECOMPILE

C'est un peu un marteau. Il recompile chaque instruction du module. L'utilisation OPTION (RECOMPILE)des instructions sensibles aux paramètres est une solution plus ciblée.

  1. Réaffectez les valeurs des paramètres aux variables locales et utilisez-les à la place des paramètres

Cela a le même effet OPTIMIZE FOR UNKNOWNqu'un plan est généré sur la base de valeurs moyennes. Le plan n'est pas recompilé à chaque exécution.

Pour plus d'informations, veuillez consulter mon article Reniflage de paramètres, incorporation et options RECOMPILE .

Paul White 9
la source