SQL Server忽略索引并执行表扫描

时间:2017-08-03 14:48:16

标签: sql-server indexing full-table-scan

我们的一个查询有一点问题,它是通过System.Data.SqlClient.SqlCommand在.Net(4.5)应用程序中执行的。

问题是,查询将执行非常慢的表扫描。所以执行计划在这里显示表扫描

截图: enter image description here

细节: enter image description here

因此文本显示,过滤器 Termine.Datum Termine.EndDatum 导致表扫描。但是为什么SQL-Server会忽略索引呢? Termine.Datum Termine.EndDatum 有两个索引。我们还尝试添加第三个 Datum EndDatum 组合。

索引都是非聚集索引,两个字段都是 DateTime

2 个答案:

答案 0 :(得分:0)

它根据估计的行数124844决定表扫描,其中您的实际行数仅为831.

优化器认为要遍历124844,最好在表格而不是索引搜索中进行扫描。

还需要检查除Index之外选择的其他列。如果您选择了除Index之外的其他列,则在执行索引查找后必须执行RID查找,优化程序可能会认为它不是RID查找,而是优先使用表扫描。

首先修复:更新统计信息并向优化程序提供足够的信息以选择更好的计划。

答案 1 :(得分:0)

您能提供完整的查询吗?我看到你正在提取一系列 3个月的数据。如果此范围是可能正在扫描的数据集的高百分比,则由于您尝试返回如此大比例的数据。如果指数没有足够的选择性,它就不会被拿起。

也...

过滤器中有OR子句。通过查看您提供的屏幕截图中的谓词,您可能会在两个不同的过滤器周围丢失()。这也可能导致扫描。

还有一件事...... OR条款有时会导致错误的计划 - 另一种方法是将查询拆分为两个UNIONED个查询,每个查询中包含不同的OR。如果您提供查询,我应该能够为您提供重写版本以显示此信息。