Тот же запрос имеет другой план выполнения в SP

45
4

Когда тот же самый запрос помещается в хранимую процедуру, он генерирует совершенно другой исполняемый план, который занимает ~ 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.

Есть предположения?

спросил(а) 2015-01-24T20:46:00+03:00 4 года, 10 месяцев назад
1
Решение
63

Локальные переменные и параметры - это совершенно разные вещи, даже если запрос идентичен. С помощью локальных переменных подсчет строк оценки SQL Server основан на статистических средних значениях плотности, поскольку фактическое значение неизвестно во время компиляции. Однако в случае параметра фактические значения параметров "обнюхиваются", а оценка извлекается из гистограммы статистики для фактического значения. Результирующие планы выполнения могут отличаться, если оценочное количество строк существенно отличается.

Вышеупомянутые симптомы могут свидетельствовать о том, что статистика устарела или упоминается проблема с параметром нюхания. Попробуйте обновить статистику по таблице с помощью FULLSCAN и повторите параметризованный запрос, чтобы узнать, лучше ли этот план:

UPDATE STATISTICS ON dbo.Books WITH FULLSCAN;
UPDATE STATISTICS ON dbo.BookPublishRegions WITH FULLSCAN;

ответил(а) 2015-01-24T20:54:00+03:00 4 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема