ich eine gespeicherte Prozedur, die eine Datumseingabe akzeptiert, die später auf das aktuelle Datum gesetzt wird, wenn kein Wert übergeben wird:SQL schlecht gespeicherte Prozedur Ausführungsplan Performance - Parameter Sniffing
CREATE PROCEDURE MyProc
@MyDate DATETIME = NULL
AS
IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
-- Do Something using @MyDate
bin ich mit Problemen Wenn @MyDate
als NULL
übergeben wird, wenn die gespeicherte Prozedur zuerst kompiliert wird, ist die Leistung immer schrecklich für alle Eingabewerte (NULL
oder andere), wenn ein Datum/das aktuelle Datum übergeben wird, wenn die gespeicherte Prozedur kompiliert wird in Ordnung für alle Eingabewerte (NULL
oder anders).
Was auch verwirrend ist, dass der schlechte Ausführungsplan, der in schrecklich selbst erzeugt wird, wenn der Wert von @MyDate verwendete ist eigentlichNULL
(und nicht auf CURRENT_TIMESTAMP
durch die IF-Anweisung)
I‘ habe entdeckt, dass (durch spoofing den Parameter) behebt mein Problem Sniffing Parameter zu deaktivieren:
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
ich weiß, das etwas mit dem Parameter Sniffing zu tun ist, aber alle Beispiele ich je gesehen habe „Parameter Sniffing gone bad“ habe die gespeicherte Prozedur be handelt Ich habe gesehen, dass der Ausführungsplan für alle erdenklichen Werte schrecklich ist, die der SQL-Server möglicherweise für den Punkt hält, an dem die Anweisung ausgeführt wird - NULL
, CURRENT_TIMESTAMP
oder auf andere Weise .
Hat jemand einen Einblick, warum das passiert?
Das ist interessant, aber du bist nicht wirklich irgendwo eine Frage zu stellen ... – cjk
Das ist mir gerade aufgefallen :-) – Justin