Следующее использование запроса индекс ищет на индексе на столбце 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'
Запрос ниже, который почти идентичен вышеприведенному запросу, использует сканирование кластерного индекса, вместо индекса на
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).
Это, однако, не гарантирует, что индекс будет использован.
Вы можете создать руководство по плану с помощью sp_create_plan_guide. См. раздел Оптимизация запросов в развернутых приложениях с помощью руководств по плану. Руководство по плану поможет оптимизатору принять решение об использовании поиска по диапазону индексов или кластеризованного сканирования.