ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 一个条件引发的性能问题

一个条件引发的性能问题

原创 Linux操作系统 作者:husthxd 时间:2009-01-07 15:51:29 0 删除 编辑

废话少说,先看看SQL语句:

SELECT a.dwid,                                            

       a.xzdm,

       a.grbh,

       TRIM (b.xm),

       c.sfzmhm,

       '6',

       c.ryzt,

       c.rylb_dm,

       c.ygxs_dm,

       c.hjlx_dm,

       a.jfzje - NVL (a.grbc01, 0) - NVL (a.gwybc01, 0),    

       a.jfgz                                                  

FROM a,

     b,

     c

WHERE a.dwid = 'x'

   AND c.dwsbh = 'x'

   AND a.grbh = b.grbh

   AND a.grbh = c.sbbh;


表a和b的总记录数在100万条左右,a.dwid和b.dwsbh上均有索引,条件'x'过滤后的记录数大约是3万条左右。另外,a.grbh和c.sbbh上亦均有索引。


sql语句执行计划如下:

Plan

SELECT STATEMENT  CHOOSE                        

    11 FILTER                      

        10 NESTED LOOPS OUTER                  

            8 NESTED LOOPS              

                5 NESTED LOOPS          

                    2 TABLE ACCESS BY INDEX ROWID C     

                        1 INDEX RANGE SCAN NON-UNIQUE IDX_C_DWSBH

                    4 TABLE ACCESS BY INDEX ROWID A     

                        3 INDEX RANGE SCAN NON-UNIQUE IDX_A_DWID00

                7 TABLE ACCESS BY INDEX ROWID B         

                    6 INDEX UNIQUE SCAN UNIQUE SYS_C0014448     

            9 INDEX UNIQUE SCAN UNIQUE SYS_C0024173

        

语句执行了30mins以上仍然没有执行完毕。


把sql语句改为:

SELECT a.dwid,                                            

       a.xzdm,

       a.grbh,

       TRIM (b.xm),

       c.sfzmhm,

       '6',

       c.ryzt,

       c.rylb_dm,

       c.ygxs_dm,

       c.hjlx_dm,

       a.jfzje - NVL (a.grbc01, 0) - NVL (a.gwybc01, 0),    

       a.jfgz                                                  

FROM a,

     b,

     c

WHERE a.dwid = 'x'

   AND a.grbh = b.grbh

   AND a.grbh = c.sbbh;


执行计划:

Plan

INSERT STATEMENT  CHOOSE                       

    11 FILTER                     

        10 NESTED LOOPS OUTER                 

            8 NESTED LOOPS             

                5 NESTED LOOPS         

                    2 TABLE ACCESS BY INDEX ROWID A    

                        1 INDEX RANGE SCAN NON-UNIQUE IDX_A_DWID00

                    4 TABLE ACCESS BY INDEX ROWID C    

                        3 INDEX UNIQUE SCAN UNIQUE SYS_C0024164

                7 TABLE ACCESS BY INDEX ROWID B        

                    6 INDEX UNIQUE SCAN UNIQUE SYS_C0014448    

            9 INDEX UNIQUE SCAN UNIQUE SYS_C0024173


从两者的执行计划来看,驱动表不同而已,由于记录数相差不大,影响不大,不过去掉条件c.dwsbh='x'后,这条语句执行时间<2secs,效率相差N倍。

其实读取A表的数据后,就可以根据A的grbh通过c.sbbh上的索引访问表c了,加上了条件c.dwsbh='x'反而是画蛇添足,严重影响效率。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-531656/,如需转载,请注明出处,否则将追究法律责任。

上一篇: NUMBER精度问题
下一篇: 不许抢劫
请登录后发表评论 登录
全部评论
ITPUB数据库版块资深版主,对Oracle、PostgreSQL有深入研究。

注册时间:2007-12-28

  • 博文量
    1559
  • 访问量
    4242685