我们的一个查询有一点问题,它是通过System.Data.SqlClient.SqlCommand
在.Net(4.5)应用程序中执行的。
问题是,查询将执行非常慢的表扫描。所以执行计划在这里显示表扫描
因此文本显示,过滤器 Termine.Datum 和 Termine.EndDatum 导致表扫描。但是为什么SQL-Server会忽略索引呢? Termine.Datum 和 Termine.EndDatum 有两个索引。我们还尝试添加第三个 Datum 和 EndDatum 组合。
索引都是非聚集索引,两个字段都是 DateTime 。
答案 0 :(得分:0)
它根据估计的行数124844决定表扫描,其中您的实际行数仅为831.
优化器认为要遍历124844,最好在表格而不是索引搜索中进行扫描。
还需要检查除Index之外选择的其他列。如果您选择了除Index之外的其他列,则在执行索引查找后必须执行RID查找,优化程序可能会认为它不是RID查找,而是优先使用表扫描。
首先修复:更新统计信息并向优化程序提供足够的信息以选择更好的计划。
答案 1 :(得分:0)
您能提供完整的查询吗?我看到你正在提取一系列 3个月的数据。如果此范围是可能正在扫描的数据集的高百分比,则由于您尝试返回如此大比例的数据。如果指数没有足够的选择性,它就不会被拿起。
也...
过滤器中有OR
子句。通过查看您提供的屏幕截图中的谓词,您可能会在两个不同的过滤器周围丢失()
。这也可能导致扫描。
还有一件事......
OR
条款有时会导致错误的计划 - 另一种方法是将查询拆分为两个UNIONED
个查询,每个查询中包含不同的OR
。如果您提供查询,我应该能够为您提供重写版本以显示此信息。