Поиск индекса по сравнению с кластерным сканированием индекса - почему выбрано сканирование? - PullRequest
8 голосов
/ 05 марта 2010

В следующем запросе используется поиск по индексу в столбце 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'

Ответы [ 2 ]

6 голосов
/ 05 марта 2010

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

6 голосов
/ 05 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...