0

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

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

截屏: 在此处输入图像描述

细节: 在此处输入图像描述

因此文本显示,对Termine.DatumTermine.EndDatum的过滤器会导致 Table-Scan。但是为什么 SQL-Server 会忽略索引呢?Termine.DatumTermine.EndDatum上有两个索引。我们还尝试结合DatumEndDatum添加第三个。

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

4

2 回答 2

0

你能提供完整的查询吗?我看到您正在提取一系列跨越3 个月的数据。如果此范围在数据集中占很大比例,则可能是由于您尝试返回如此大比例的数据而正在扫描。如果索引的选择性不够,它将不会被拾取。

还...

您在过滤器中有一个OR子句。通过查看您提供的屏幕截图中的谓词,您似乎可能缺少()两个不同的过滤器。这也可能导致扫描。

还有一件事...... OR子句有时会导致错误的计划 - 另一种方法是将查询分成两个UNIONED查询,每个查询都有不同OR的内容。如果您提供查询,我应该能够给您一个重写的版本来显示这一点。

于 2017-08-03T16:29:23.317 回答
0

它根据估计的行数 124844 决定表扫描,因为您的实际行只有 831。

优化器认为遍历 124844 最好在表中进行扫描而不是 Index Seek。

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

第一个修复:更新统计信息并为优化器提供足够的信息以选择更好的计划。

于 2017-08-03T14:53:38.070 回答