繁体   English   中英

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

[英]SQL Server ignoring index and performs table scan

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

问题是查询将执行非常慢的表扫描。 因此执行计划在此处显示了表格扫描

截图: 在此处输入图片说明

细节: 在此处输入图片说明

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

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

它基于估计的行数124844决定表扫描,而实际行数仅为831。

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

还需要检查除索引之外选择的其他列。 如果选择了除“索引”以外的其他列,则必须在执行索引查找后执行“ RID查找”,Optimizer可能会认为与其优先选择“表扫描”而不是RID查找。

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

您可以提供完整的查询吗? 我看到您正在提取一系列跨越3个月的数据 如果此范围占数据集的较大百分比,则可能由于您试图返回如此大的数据百分比而正在扫描。 如果索引的选择性不够高,则不会被选择。

也...

您在过滤器中有一个OR子句。 通过查看屏幕快照中提供的谓词,您看起来好像在两个不同的过滤器之间缺少了() 这也可能导致扫描。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM