Ho una stored procedure che accetta un ingresso di data che viene successivamente impostato sulla data corrente se nessun valore viene passato:SQL piano di poveri stored procedure di esecuzione delle prestazioni - parametro sniffing
CREATE PROCEDURE MyProc
@MyDate DATETIME = NULL
AS
IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
-- Do Something using @MyDate
Ho problemi per cui se @MyDate
viene passato come NULL
quando la stored procedure viene prima generata, la prestazione è sempre terribile per tutti i valori di ingresso (NULL
o altro), wheras se/viene passato quando la stored procedure viene compilato prestazioni è una data la data corrente bene per tutti i valori di input (NULL
o altro).
Ciò che è anche confusione è che il piano di esecuzione poveri che si genera in è terribile anche quando il valore di @MyDate utilizzato è in realtà NULL
(e non impostato su CURRENT_TIMESTAMP
dalla dichiarazione IF)
I' ve scoperto che disattivando il parametro sniffing (dal spoofing parametro) consente di risolvere il mio problema:
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
so che questo è qualcosa a che fare con il parametro sniffing, ma tutti gli esempi che ho visto di "sniffing dei parametri Gone Bad" hanno coinvolto la stored procedure essere passato compilato con un parametro non rappresentativo passato, tuttavia qui sto vedendo che il piano di esecuzione è terribile per tutti i valori concepibili che il server SQL potrebbe pensare che il parametro potrebbe prendere nel punto in cui viene eseguita l'istruzione - NULL
, CURRENT_TIMESTAMP
o in altro modo .
Qualcuno ha qualche idea sul perché questo sta accadendo?
Questo è interessante, ma sei in realtà non fare una domanda da nessuna parte qui ... – cjk
Appena notato che :-) – Justin