我有以下sql语句。当我检查这个查询的执行计划时,我们观察到一个索引扫描。如何将其替换为索引查找。我对IdDeleted列有非聚集索引。

SELECT Cast(Format(Sum(COALESCE(InstalledSubtotal, 0)), 'F') AS MONEY) AS TotalSoldNet,
BP.BoundProjectId AS ProjectId
FROM BoundProducts BP
WHERE BP.IsDeleted=0 or BP.IsDeleted is null
GROUP BY BP.BoundProjectId我试着这样做,得到了索引搜索,但结果是错误的。
SELECT Cast(Format(Sum(COALESCE(InstalledSubtotal, 0)), 'F') AS MONEY) AS TotalSoldNet,
BP.BoundProjectId AS ProjectId
FROM BoundProducts BP
WHERE BP.IsDeleted=0
GROUP BY BP.BoundProjectId 有没有人可以建议我使用索引搜索来获得正确的结果集?
我的意思是如何替换(BP.IsDeleted=0或BP.IsDeleted为null)条件来使用索引查找。
编辑,添加了以下答案之一的注释中的行数:
null: 254962 rows
0: 392002 rows
1: 50211 rows发布于 2015-10-06 23:04:21
您不会得到索引查找,因为您正在抓取表中几乎93%的行,在这种情况下,仅扫描整个索引会更快,而且成本更低。
如果您有性能问题,您应该考虑删除format() -function,特别是当查询返回很多行的时候。阅读more from this blog post
其他选择可能是创建索引视图并预先聚合数据。这当然会增加update / insert操作的开销,因此请考虑这样做的频率与表的更新频率之间的关系。
发布于 2015-10-06 22:01:57
你有没有尝试过联合行动?选择...Where isdeleted =0 UNION ALL select ...其中isdeleted为空
或者,您可以添加查询提示(index=索引名称)
还要注意,基数将决定SQL是使用查找还是扫描--查找速度更快,但如果索引没有覆盖所需的所有列,则可能需要键查找。一个很好的经验法则是,如果查询将返回超过5%的表,那么SQL将首选扫描。
https://stackoverflow.com/questions/32971763
复制相似问题