Mam procedurę przechowywaną, która akceptuje wejście datę, która jest później zestaw do bieżącej daty, jeśli wartość nie jest przekazywana w:SQL wykonanie planu biedny procedura przechowywana wydajność - parametr wąchania
CREATE PROCEDURE MyProc
@MyDate DATETIME = NULL
AS
IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
-- Do Something using @MyDate
Mam problemy przy czym jeśli @MyDate
jest przekazywany jako NULL
, gdy procedura składowana jest najpierw kompilowana, wydajność jest zawsze straszna dla wszystkich wartości wejściowych (NULL
lub w inny sposób), lub jeśli data/aktualna data jest przekazywana podczas kompilacji procedury składowanej, wydajność jest grzywny dla wszystkich wartości wejściowych (NULL
lub w inny sposób).
Co jest również mylące jest to, że biedny plan wykonania, który jest generowany w jest straszna nawet gdy wartość @MyDate stosowany jest faktycznieNULL
(a nie ustawione CURRENT_TIMESTAMP
sprawozdaniem if)
I wcześniej odkryto, że wyłączenie parametr wąchania (o fałszowanie parametr) rozwiązuje mój problem:
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
wiem, że to ma coś wspólnego z parametrem wąchania, ale wszystkie przykłady widziałem od „parametru wąchania gone bad” włączyłem procedurę przechowywaną ing skompilowany z niereprezentatywnym parametrem przekazywanym, jednak widzę, że plan wykonania jest okropny dla wszystkich możliwych wartości, które serwer SQL mógłby uznać za parametr, który może zająć w miejscu, w którym instrukcja jest wykonywana - NULL
, lub w inny sposób .
Czy ktoś ma wgląd w to, dlaczego tak się dzieje?
To ciekawe, ale jesteś właściwie nie pytając nigdzie o to pytanie ... – cjk
Właśnie zauważyłem, że :-) – Justin