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
или иным образом.
Кто-нибудь понял, почему это происходит?