为什么聚簇索引扫描执行数如此之高?


15

我有两个类似的查询生成相同的查询计划,除了一个查询计划执行1316次“聚簇索引扫描”,而另一个查询计划执行1次。

这两个查询之间的唯一区别是日期标准不同。长时间运行的查询实际上会缩小日期条件,并拉回较少的数据。

我已经确定了一些对两个查询都有用的索引,但是我只想了解为什么“聚集索引扫描”运算符在查询上执行1316次实际上与执行1次查询相同。

我检查了有关正在扫描的PK的统计信息,它们是相对最新的。

原始查询:

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

生成此计划: 在此处输入图片说明


您可以将查询复制/粘贴到代码块而不是图像文件中吗?
埃里克·汉弗莱

当然-我添加了生成每个计划的查询。
Seibar 2011年

聚集索引扫描发生在哪个表上?
埃里克·汉弗莱

聚簇索引扫描位于左联接中的子查询上(PostNFIRSSummary)
Seibar 2011年

1
大概是上次更新统计信息时,只有零或一行符合FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'条件,此后此范围内插入的数量不成比例。它估计在该日期范围内仅需要执行1.07次。实际上并不是1,316。
马丁·史密斯

Answers:


9

扫描后的JOIN提供了一个线索:在最后一个联接的一侧(当然,从右到左读取)的行数较少时,优化器选择“嵌套循环”而不是“哈希联接”。

但是,在研究此内容之前,我打算消除键查找和DISTINCT。

  • 关键查找:您在FIR_Incident上的索引可能会覆盖,(FI_IncidentDate, incidentid)或者可能覆盖其他方向。或同时使用两者,看看哪个更经常使用(两者可能都使用)

  • DISTINCT是的结果LEFT JOIN ... IS NOT NULL。优化器已经将其删除(计划在最终的JOIN中具有“左半联接”),但为了清楚起见,我将使用EXISTS

就像是:

select 
    F.IncidentID
from 
    FIR_Incident F
where 
    exists (SELECT * FROM postnfirssummary P
           WHERE P.incident_id = F.incidentid)
    AND
    F.FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'

您还可以使用计划指南和JOIN提示使SQL Server使用哈希联接,但是请首先使其正常工作:指南或提示可能经不起时间的考验,因为它们仅对数据和数据有用。您现在而不是将来运行的查询

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.