SQL mauvaise exécution de la procédure stockée plan de la performance - la détection des paramètres
J'ai une procédure stockée qui accepte une date d'entrée plus tard à la date actuelle si aucune valeur n'est transmise dans:
CREATE PROCEDURE MyProc
@MyDate DATETIME = NULL
AS
IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
-- Do Something using @MyDate
Je vais avoir des problèmes en vertu de laquelle si @MyDate
est transmis en tant que NULL
lorsque la procédure stockée est d'abord compilé, la performance est toujours terrible pour toutes les valeurs d'entrée (NULL
ou autre), wheras si un jour /la date actuelle est passé lors de la procédure stockée est compilé performance est parfait pour toutes les valeurs d'entrée (NULL
ou autre).
Ce qui est déroutant, c'est que de la mauvaise exécution du plan qui est généré dans est terrible, même lorsque la valeur de @Madate utilisé est fait NULL
(et non à CURRENT_TIMESTAMP
par l'instruction if)
J'ai découvert que la désactivation de la détection des paramètres (en modifiant le paramètre) résout mon problème:
CREATE PROCEDURE MyProc
@MyDate DATETIME = NULL
AS
DECLARE @MyDate_Copy DATETIME
SET @MyDate_Copy = @MyDate
IF @MyDate_Copy IS NULL SET @MyDate_Copy = CURRENT_TIMESTAMP
-- Do Something using @MyDate_Copy
Je sais que c'est quelque chose à voir avec la détection des paramètres, mais tous les exemples que j'ai vu de détection des paramètres gone bad" ont participé à la procédure stockée en cours d'élaboration avec un non-représentatif paramètre transmis, mais ici je vois que le plan d'exécution est terrible pour toutes les valeurs de SQL server peut penser que le paramètre peut prendre à l'endroit où l'instruction est exécutée - NULL
, CURRENT_TIMESTAMP
ou autrement.
Quiconque a aucune information sur le pourquoi de ce qui se passe?
Viens de remarquer que 🙂
OriginalL'auteur Justin | 2009-06-17
Vous devez vous connecter pour publier un commentaire.
En principe oui - détection des paramètres (dans certains niveaux des correctifs de SQL Server 2005 est mal cassé. J'ai vu des plans qui effectivement ne jamais se terminer (dans les heures sur un petit ensemble de données), même pour les petits (quelques milliers de lignes) ensembles de données, qui complète en quelques secondes une fois que les paramètres sont masqués. Et c'est dans le cas où le paramètre a toujours été le même nombre. Je voudrais ajouter que, dans le même temps de m'occuper de cela, j'ai trouvé beaucoup de problèmes avec LEFT JOIN/Null ne pas terminer et je l'ai remplacé avec PAS ou n'EXISTE PAS et cela a résolu le plan de quelque chose qui serait complète. Encore une fois, une (très mauvaise) plan d'exécution en question. Au moment de m'occuper de cela, les Administrateurs de base de données ne serait pas me donner le plan d'exécution d'accès, et depuis que j'ai commencé le masquage de chaque paramètre SP, je n'ai pas eu du tout de la poursuite de l'exécution du plan de questions où je dois creuser pour non-achèvement.
Dans SQL Server 2008, vous pouvez utiliser
OPTIMIZE FOR UNKNOWN
.OriginalL'auteur Cade Roux
Une façon que j'ai été en mesure de contourner ce problème en (SQL Server 2005) au lieu de simplement masquant les paramètres par redeclaring paramètres locaux a été d'ajouter optimiseur de requête conseils.
Voici un bon blog qui parle plus à ce sujet:
La détection des paramètres dans sql server 2005
J'ai utilisé: l'OPTION optimiser pour (@p = '-1'))
OriginalL'auteur Matt Palmerlee