我有以下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
答案 0 :(得分:1)
你没有获得索引搜索,因为你正在获取表中几乎93%的行,在这种情况下,只需扫描整个索引就可以更快,更便宜。
如果遇到性能问题,应该考虑删除format()-function,尤其是在查询返回大量行时。阅读more from this blog post
其他选项可能是创建索引视图并预先汇总您的数据。这当然会增加更新/插入操作的开销,因此请考虑这种情况,只有这种情况经常与表的更新频率相关。
答案 1 :(得分:0)
或者您可以添加查询提示(index = [indexname])
还要注意,基数将决定SQL是使用搜索还是扫描 - 搜索更快但如果索引不覆盖所需的所有列,则可能需要密钥查找。一个好的经验法则是,如果查询将返回超过表的5%,那么SQL将更喜欢扫描。