Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Le paramètre ne fonctionne pas aussi bien que le codage en dur de la valeur

MODIFIER LE RÉSUMÉ À la demande de Damien_The_Unbeliever

L'objectif est d'obtenir les meilleures/la plupart des informations sur la valeur de la variable vers SQL AVANT que le plan ne soit créé, généralement le reniflage des paramètres le fait. Il peut y avoir une raison pour laquelle le reniflage de paramètres a été "désactivé" dans ce cas. Sans voir une meilleure représentation du code réel, nous ne pouvons pas vraiment dire quelle est la solution ou pourquoi le problème existe. Essayez les choses ci-dessous pour forcer les zones affectées à générer des plans en utilisant les valeurs réelles.

*VERSION LONGUE AVEC PLUS DE DÉTAILS*

Est-ce votre proc stocké réel ? Avez-vous des valeurs par défaut pour vos paramètres ? Si c'est vrai, que sont-ils?

Le reniflage de paramètres peut aider - mais il doit avoir des valeurs de paramètres typiques pour bien créer le plan, et si ce n'est pas le cas, cela n'aidera pas vraiment ou créera un mauvais plan basé sur la valeur de paramètre non typique. Donc, si une variable a une valeur par défaut de null ou une valeur qui n'est pas une valeur typique la première fois qu'elle est exécutée et que le plan est compilé, cela crée un mauvais plan.

Si quelqu'un d'autre a écrit ce sproc, il se peut qu'il ait intentionnellement "désactivé" le reniflage de paramètres avec les variables locales pour une raison. Les règles métier peuvent exiger ces structures variables.

L'objectif est d'obtenir les meilleures/la plupart des informations sur la valeur de la variable vers SQL AVANT que le plan ne soit créé, et généralement le reniflage de paramètres le fait. Mais il y a des choses qui peuvent le faire affecter négativement les performances, et c'est peut-être pourquoi il est "désactivé". Il semble toujours que le plan soit créé avec des valeurs atypiques pour les paramètres ou pas encore assez d'informations - en utilisant ou non le reniflage de paramètres.

Essayez d'appeler la requête à l'intérieur du sproc avec Use sp_executesql pour exécuter les requêtes affectées, en le forçant à générer un plan pour cette zone avec les variables réelles, et voyez si c'est mieux. Cela peut être votre solution si vous devez avoir ce type de valeur de paramètre irrégulière - créer des procs stockés qui exécutent les parties affectées et les appeler plus tard depuis la procédure stockée - après que la variable a reçu une valeur typique.

Sans voir une meilleure représentation du code réel, il est difficile de voir quel est le problème. J'espère que ces informations vous aideront -