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?

Ce qui est intéressant, mais vous n'êtes pas en train de poser une question nulle part ici...
Viens de remarquer que 🙂

OriginalL'auteur Justin | 2009-06-17