打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SQL 语句优化--OR 语句优化案例
看了前几天监控的sql语句和数据变化,发现有一条语句的io次数很大,达到了150万次IO,而两个表的数据也就不到20万,为何有如此多的IO次数,下面是执行语句: 
select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi, 
Workflowstep ws 
where ws.workflowid='402881db1b441e6f011c0cff320e4766' and (wi.laststepid = ws.id or (wi.curstepid = ws.id and isreceived=1 and issubmited =1)) 

  执行IO统计结果如下:

(22 行受影响)
表 
'workflowstep'。扫描计数 1,逻辑读取 23 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'Worktable'。扫描计数 4,逻辑读取 1490572 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'workflowinfo'。扫描计数 4,逻辑读取 12208 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

  执行计划如下:

  

    这里发现:主要是嵌套循环算法占的开销最大。个人感觉是“Or”引起的性能问题,后来根据业务逻辑改写。如下:

    语句修改如下:

  select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi, Workflowstep ws
where ws.workflowid='402881db1b441e6f011c0cff320e4766' and (wi.laststepid = ws.id) 
union all 
  
select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi, Workflowstep ws where ws.workflowid='402881db1b441e6f011c0cff320e4766' and  (wi.curstepid = ws.id and isreceived=1 and issubmited =1)

 

   查询IO次数如下:

(22 行受影响)
表 
'workflowinfo'。扫描计数 36,逻辑读取 142 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'workflowstep'。扫描计数 2,逻辑读取 46 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

  执行计划如下:

 

   这里发现:成本不在是嵌套循环上的开销了,IO次数大大减少。

   总结:

      这里通过改写”OR“语句成“Union”语句,性能大大提高,用了or语句,数据库优化器无法优化,这里都是用的“嵌套循环算法”,但是使用方式不一样,同样得到不同的结果。

      对于类似的语句,可以将其改写成”Union“ 或”Union All“ 语句。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON
Sql Server性能优化辅助指标SET STATISTICS TIME ON和SET STATISTICS IO ON
SQL Server 查询性能优化——索引与SARG(四)
SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好?
in和exists的区别与执行效率问题解析
从逻辑入手优化数据库性能
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服