Недавно мы столкнулись с проблемой переломного момента, и некоторые из наших запросов отчетов, которые раньше выполнялись в течение нескольких секунд, теперь занимают более 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';
- пожалуйста, смотрите этот пост в блоге, а также этот .