性能调优SQL

时间:2015-10-06 13:50:43

标签: sql sql-server sql-server-2012

我有以下sql。当我检查此查询的执行计划时,我们观察索引扫描。如何用索引搜索替换它。我在IdDeleted列上有非聚集索引。Execution Plan

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

2 个答案:

答案 0 :(得分:1)

你没有获得索引搜索,因为你正在获取表中几乎93%的行,在这种情况下,只需扫描整个索引就可以更快,更便宜。

如果遇到性能问题,应该考虑删除format()-function,尤其是在查询返回大量行时。阅读more from this blog post

其他选项可能是创建索引视图并预先汇总您的数据。这当然会增加更新/插入操作的开销,因此请考虑这种情况,只有这种情况经常与表的更新频率相关。

答案 1 :(得分:0)

你试过UNION ALL吗? 选择 ... where isleleted = 0 UNION ALL 选择 ... isdeleted为null

或者您可以添加查询提示(index = [indexname])

还要注意,基数将决定SQL是使用搜索还是扫描 - 搜索更快但如果索引不覆盖所需的所有列,则可能需要密钥查找。一个好的经验法则是,如果查询将返回超过表的5%,那么SQL将更喜欢扫描。