У меня есть два похожих запроса, которые генерируют один и тот же план запроса, за исключением того, что один план запроса выполняет сканирование кластерного индекса 1316 раз, а другой - 1 раз.
Единственная разница между двумя запросами - это разные критерии даты. Долгосрочный запрос фактически сужает критерии даты и тянет меньше данных.
Я определил некоторые индексы, которые помогут с обоими запросами, но я просто хочу понять, почему оператор Clustered Index Scan выполняет 1316 раз для запроса, который практически совпадает с тем, который выполняется 1 раз.
Я проверил статистику на ПК, который сканируется, и он относительно актуален.
Исходный запрос:
select distinct FIR_Incident.IncidentID
from FIR_Incident
left join (
select incident_id as exported_incident_id
from postnfirssummary
) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid
where FI_IncidentDate between '2011-06-01 00:00:00.000' and '2011-07-01 00:00:00.000'
and exported_incidents.exported_incident_id is not null
Создает этот план:
После сужения критериев диапазона дат:
select distinct FIR_Incident.IncidentID
from FIR_Incident
left join (
select incident_id as exported_incident_id
from postnfirssummary
) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid
where FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'
and exported_incidents.exported_incident_id is not null
Создает этот план:
FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'
критериям, и с тех пор в этом диапазоне было непропорционально большое количество вставок. По оценкам, для этого диапазона дат потребуется только 1,07 казней. Не 1316, которые следуют в действительности.