SQL плохая производительность плана выполнения хранимых процедур - сниффинг параметров

У меня есть хранимая процедура, которая принимает ввод даты, который позже устанавливается на текущую дату, если не передается значение в:

<code>CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
    -- Do Something using @MyDate
</code>

У меня есть проблемы, из-за которых, если@MyDate передается какNULL когда хранимая процедура впервые компилируется, производительность всегда ужасна для всех входных значений (NULL или иным образом), если передана дата / текущая дата, когда хранимая процедура скомпилирована, производительность подходит для всех входных значений (NULL или иным образом).

Что также сбивает с толку, так это то, что плохой план выполнения, который генерируется в нем, ужасен, даже если используется значение @MyDateactually NULL (и не установлен наCURRENT_TIMESTAMP по заявлению IF)

Я обнаружил, что отключение сниффинга параметров (путем подмены параметра) решает мою проблему:

<code>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
</code>

Я знаю, что это как-то связано со сниффингом параметров, но все примеры, которые я видел для "сниффинга параметров, пошли плохо". включили хранимую процедуру, скомпилированную с переданным нерепрезентативным параметром, однако здесь я вижу, что план выполнения ужасен для всех мыслимых значений, которые SQL-сервер может подумать, что параметр может принять в точке выполнения инструкции -NULL, CURRENT_TIMESTAMP или иным образом.

Кто-нибудь понял, почему это происходит?

Ответы на вопрос(2)

Ваш ответ на вопрос