Я знаю, что это как-то связано с анализом параметров, но я просто озадачен тем, как что-то вроде следующего примера возможно даже с технологией, которая хорошо справляется со многими сложными вещами.
Многие из нас сталкивались с хранимыми процедурами, которые периодически запускаются на несколько порядков медленнее, чем обычно, и затем, если вы выкроите sql из процедуры и используете те же значения параметров в отдельном окне запроса, он будет выполняться так же быстро как обычно.
Я просто исправил такую процедуру, преобразовав это:
alter procedure p_MyProc
(
@param1 int
) as -- do a complex query with @param1
к этому:
alter procedure p_MyProc
(
@param1 int
)
as
declare @param1Copy int;
set @param1Copy = @param1;
-- Do the query using @param1Copy
Он перешел от бега более минуты назад к менее чем одной секунде, как это обычно происходит. Такое поведение кажется совершенно случайным. Для 9 из 10 входных данных @ param1 запрос выполняется быстро, независимо от того, сколько данных ему нужно обработать, или насколько велик результат, заданный им. Но для этого 1 из 10, это просто теряется. И исправление состоит в том, чтобы заменить int на тот же int в запросе?
Это не имеет смысла.
[Изменить]
@ gbn связан с этим вопросом, в котором подробно описана похожая проблема:
Известная проблема ?: Не удается завершить хранимую процедуру SQL Server 2005 с параметром
Стесняюсь плакать "Жук!" потому что это часто отговорка, но это действительно кажется мне ошибкой. Когда я запускаю две версии моей хранимой процедуры с одним и тем же вводом, я вижу одинаковые планы запросов. Разница лишь в том, что запуск оригинала занимает больше минуты, а версия с тупым копированием параметров запускается мгновенно.