Тот же запрос имеет другой план выполнения в SP
Когда тот же самый запрос помещается в хранимую процедуру, он генерирует совершенно другой исполняемый план, который занимает ~ 18 секунд.
В отличие от того, когда я запускаю соло (и просто DECLARE переменные выше запроса), он работает значительно быстрее ~ 1-2 секунды.
Что я могу сделать, чтобы запрос в SP выполнялся с использованием плана выполнения при запуске соло? FYI, я даже воспроизвел проблему, создав совершенно новую хранимую процедуру и буквально скопировав в нее запрос. Те же результаты ~ 18 секунд.
Запрос приведен ниже для справки
select
COUNT(b.BookKey) as RowCounter
from
Books b (nolock)
inner join BookPublishRegions bp (nolock)
on b.BookKey = bp.BookKey
where
b.IsUnavailable = 0 and
(@AuthorKey is null or b.AuthorKey = @AuthorKey) and
(b.Price between @MinPrice and @MaxPrice) and
contains(bp.PublishRegionName, @SearchTerm)
У меня есть индексы на b.IsUnavailable, b.AuthorKey, b.Price и полнотекстовый индекс на bp.PublishRegionName.
Есть предположения?
Локальные переменные и параметры - это совершенно разные вещи, даже если запрос идентичен. С помощью локальных переменных подсчет строк оценки SQL Server основан на статистических средних значениях плотности, поскольку фактическое значение неизвестно во время компиляции. Однако в случае параметра фактические значения параметров "обнюхиваются", а оценка извлекается из гистограммы статистики для фактического значения. Результирующие планы выполнения могут отличаться, если оценочное количество строк существенно отличается.
Вышеупомянутые симптомы могут свидетельствовать о том, что статистика устарела или упоминается проблема с параметром нюхания. Попробуйте обновить статистику по таблице с помощью FULLSCAN и повторите параметризованный запрос, чтобы узнать, лучше ли этот план:
UPDATE STATISTICS ON dbo.Books WITH FULLSCAN;
UPDATE STATISTICS ON dbo.BookPublishRegions WITH FULLSCAN;
- Вопросы
- Performance
- Тот же запрос имеет другой план выполнения в SP