首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性能调优SQL

性能调优SQL
EN

Stack Overflow用户
提问于 2015-10-06 21:50:43
回答 2查看 94关注 0票数 2

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

代码语言:javascript
复制
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

我试着这样做,得到了索引搜索,但结果是错误的。

代码语言:javascript
复制
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)条件来使用索引查找。

编辑,添加了以下答案之一的注释中的行数:

代码语言:javascript
复制
null: 254962 rows
0:    392002 rows
1:     50211 rows
EN

回答 2

Stack Overflow用户

发布于 2015-10-06 23:04:21

您不会得到索引查找,因为您正在抓取表中几乎93%的行,在这种情况下,仅扫描整个索引会更快,而且成本更低。

如果您有性能问题,您应该考虑删除format() -function,特别是当查询返回很多行的时候。阅读more from this blog post

其他选择可能是创建索引视图并预先聚合数据。这当然会增加update / insert操作的开销,因此请考虑这样做的频率与表的更新频率之间的关系。

票数 1
EN

Stack Overflow用户

发布于 2015-10-06 22:01:57

你有没有尝试过联合行动?选择...Where isdeleted =0 UNION ALL select ...其中isdeleted为空

或者,您可以添加查询提示(index=索引名称)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32971763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档