2017-08-03 77 views
0

我们有一个小问题,我们查询,这是一个.NET(4.5),通过应用System.Data.SqlClient.SqlCommand内部执行的一个。SQL服务器忽略索引并执行表扫描

的问题是,该查询将要执行表扫描,这是非常缓慢的。因此,执行计划展示了在这里表扫描

截图: enter image description here

细节: enter image description here

,使文本显示,该过滤器Termine.DatumTermine.EndDatum导致表扫描。但为什么SQL-Server忽略索引? Termine.DatumTermine.EndDatum上有两个索引。我们还尝试添加第三个结合的数据EndDatum

的指标都是非聚集索引和这两个领域都日期时间

+4

显然'statistics'已经过时了!!更新统计再试运行查询 –

+0

还发布查询和索引的详细信息,以获得更准确的响应。在这里分享执行计划https://www.brentozar.com/pastetheplan/ –

+0

由于您尝试两个范围查询,两个单独的索引绝对无助于您。单一的组合索引*可能有用,但不能保证如此。 –

回答

0

它决定表扫描基于估计行数124844地方为您的实际行是只有831

优化认为遍历124844它会做得更好扫描表,而不是指数的寻求。

还需要检查一下从指数选择分开等栏目。如果您选择了索引以外的其他列,则必须在执行索引查找后执行RID查找,但优化程序可能会考虑替代RID查找,因此它倾向于使用表扫描。

首先修复:更新的统计数据,并提供足够的信息来优化器选择更好的计划。

0

你能否提供完整的查询?我看到您正在拉动一系列范围为3个月的数据。如果这个范围是数据集的很高百分比,那么可能是因为您试图返回如此大比例的数据而进行扫描。如果索引不够有选择性,它就不会被拾取。

也...

你必须在过滤器的OR条款。从查看您提供的截图中的谓词可知,您可能会在两个不同的过滤器周围丢失()。这也可能导致扫描。

一项件事... OR条款有时会导致糟糕的计划 - 一种替代方法是查询拆分成每个组中都不同OR 2个UNIONED查询。如果你提供查询,我应该能够给你一个重写的版本来显示这个。

+0

需要更多时间来得到它,但:http://pastebin.com/BPpAzVrJ – slxSlashi