Индекс Ищет по сравнению со Сканированием Кластерного индекса - Почему сканирование выбрано?

Следующее использование запроса индекс ищет на индексе на столбце LastModifiedTime.

SELECT 
      CONVERT(varchar, a.ReadTime, 101) as ReadDate,
      a.SubID,
      a.PlantID,
      a.Unit as UnitID,
      a.SubAssembly
FROM dbo.Accepts a WITH (NOLOCK)
WHERE  a.LastModifiedTime BETWEEN '3/3/2010' And '3/4/2010'
AND a.SubAssembly = '400'

Запрос ниже, который почти идентичен вышеупомянутому запросу, использует сканирование кластерного индекса вместо индекса на LastModifiedTime. Кто-либо может сказать мне почему? И, что еще более важно, что я могу сделать, чтобы заставить SQL Server использовать индекс на столбце LastModifiedTime, не используя индексную подсказку.

Declare @LastModifiedTimeEnd dateTime
Declare @LastModifiedTimeStart dateTime

    SELECT 
          CONVERT(varchar, a.ReadTime, 101) as ReadDate,
          a.SubID,
          a.PlantID,
          a.Unit as UnitID,
          a.SubAssembly
    FROM dbo.Accepts a WITH (NOLOCK)
    WHERE  a.LastModifiedTime BETWEEN @LastModifiedTimeStart And @LastModifiedTimeEnd
    AND a.SubAssembly = '400'
8
задан Randy Minder 5 March 2010 в 17:36
поделиться

2 ответа

Запрос ниже, который почти идентичен вышеприведенному запросу, использует сканирование кластерного индекса, вместо индекса на LastModifiedTime. Кто-нибудь может сказать мне, почему?

Приведенный ниже запрос не знает значений параметров при построении плана и предполагает, что в общем случае сканирование по кластерному индексу лучше.

И, что более важно, что я могу сделать, чтобы заставить SQL Server использовать индекс на столбце LastModifiedTime без использования подсказки индекса.

SELECT 
      CONVERT(varchar, a.ReadTime, 101) as ReadDate,
      a.SubID,
      a.PlantID,
      a.Unit as UnitID,
      a.SubAssembly
FROM dbo.Accepts a WITH (NOLOCK)
WHERE  a.LastModifiedTime BETWEEN @LastModifiedTimeStart And @LastModifiedTimeEnd
AND a.SubAssembly = '400'
OPTION (OPTIMIZE FOR (@LastModifiedTimeStart = '3/3/2010', @LastModifiedTimeEnd = '3/4/2010'))

В качестве альтернативы можно добавить OPTION (RECOMPILE), которая будет создавать разный план выполнения при каждом запуске запроса, учитывая значения параметров (parameter sniffing).

Это, однако, не гарантирует, что индекс будет использован.

6
ответ дан 5 December 2019 в 14:02
поделиться

Вы можете создать руководство по плану с помощью sp_create_plan_guide. См. раздел Оптимизация запросов в развернутых приложениях с помощью руководств по плану. Руководство по плану поможет оптимизатору принять решение об использовании поиска по диапазону индексов или кластеризованного сканирования.

6
ответ дан 5 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: