Почему мой план плана не используется?

9

Недавно мы столкнулись с проблемой переломного момента, и некоторые из наших запросов отчетов, которые раньше выполнялись в течение нескольких секунд, теперь занимают более 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
РК Куппала
источник
Как выглядит некластерный индекс? Причина, по которой сервер игнорирует это, заключается в том, что он не думает, что это пойдет на пользу. Либо у вас ошибочный план, либо ошибочный индекс
Аллан С. Хансен
3
Кроме того, ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, пожалуйста, измените 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';- пожалуйста, смотрите этот пост в блоге, а также этот .
Аарон Бертран
@AaronBertrand Большое спасибо. Да, я тоже предложил это изменение, и они сделают это в следующем выпуске.
РК Куппала

Ответы:

11

Запрос должен соответствовать ТОЧНО, включая пробелы. Я предлагаю вам получить запрос из кэша и создать его из него, а не вводить его любым другим способом.

Роб Фарли
источник
0

ПРОЧИТАЙТЕ СВОЮ СВЯЗАННУЮ СТАТЬЮ СНОВА

Написание руководства по плану для принудительного использования вашего индекса почти наверняка не то, что вам нужно, поскольку оно приведет к неэффективному поиску закладок. Согласно вашей статье, правильным решением для наиболее эффективной производительности этого запроса было бы изменить ваш индекс на закрывающий некластеризованный индекс, другими словами, либо добавить все столбцы из вашей таблицы в индекс, либо (предпочтительно ) просто добавьте столбцы, необходимые для этого запроса, а затем измените выбор, чтобы просто вытянуть эти столбцы.

Джейсон
источник