Недавно мы столкнулись с проблемой переломного момента, и некоторые из наших запросов отчетов, которые раньше выполнялись в течение нескольких секунд, теперь занимают более 2 минут, поскольку оптимизатор запросов просто игнорирует некластеризованный индекс в столбце поиска. Пример запроса ниже:
select top 100 *
from [dbo].[t_Call]
where ID > 0
and throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id
ID
Столбец кластерного индекса и Throwtime
имеет некластеризованный индекс. В этом случае мы заметили, что throwtime
вместо ID
изменений используется план запроса и некластеризованный индекс. Мы также планируем заархивировать некоторые старые данные (в настоящее время в них 20 миллионов строк !!). Но внесение этих изменений в приложение займет некоторое время, и мне нужно найти способ заставить отчеты работать достаточно быстро, без внесения изменений на уровне приложения (ну что ж, такова жизнь!).
Введите план руководства. Я создал приведенное ниже руководство по плану с подсказкой запроса некластеризованного индекса, и по какой-то причине некластеризованный индекс по-прежнему не используется. Я что-то пропустил?
EXEC sp_create_plan_guide
@name = N'[prod2reports_callthrowtime]',
@stmt = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL',
@module_or_batch = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@params = N'@0 int, @1 datetime, @2 datetime',
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO
источник
throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
наthrowtime >= '20140320 07:00' AND throwtime < '20140324 07:00';
- пожалуйста, смотрите этот пост в блоге, а также этот .Ответы:
Запрос должен соответствовать ТОЧНО, включая пробелы. Я предлагаю вам получить запрос из кэша и создать его из него, а не вводить его любым другим способом.
источник
ПРОЧИТАЙТЕ СВОЮ СВЯЗАННУЮ СТАТЬЮ СНОВА
Написание руководства по плану для принудительного использования вашего индекса почти наверняка не то, что вам нужно, поскольку оно приведет к неэффективному поиску закладок. Согласно вашей статье, правильным решением для наиболее эффективной производительности этого запроса было бы изменить ваш индекс на закрывающий некластеризованный индекс, другими словами, либо добавить все столбцы из вашей таблицы в индекс, либо (предпочтительно ) просто добавьте столбцы, необходимые для этого запроса, а затем измените выбор, чтобы просто вытянуть эти столбцы.
источник