zoukankan      html  css  js  c++  java
  • 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“ 语句。

  • 相关阅读:
    Java实现“睡排序”——线程池Executors的使用
    浅谈HashMap与线程安全 (JDK1.8)
    Ubuntu 16 Java Develop环境快速搭建
    Spring Boot在反序列化过程中:jackson.databind.exc.InvalidDefinitionException cannot deserialize from Object value
    Java 8 – Map排序
    vue指令优化网络图片加载速度
    如何实现小于12px的字体效果
    两种以上方式实现已知或者未知宽度的垂直水平居中
    C# winform窗体间传值(使用委托或事件)
    C#栈Stack的使用
  • 原文地址:https://www.cnblogs.com/zping/p/1297238.html
Copyright © 2011-2022 走看看