У мене є два подібних запити, які генерують один і той же план запитів, за винятком того, що один план запитів виконує кластерне сканування індексів 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, що випливають із фактичності.