oracle 执行计划为什么不走hash join?(转载)

本文探讨了一则案例,其中Oracle SQL查询在表重组后执行变慢,原本采用Nested Loops的方式,导致大量consistent gets和延长的运行时间。尝试使用Hash Join后,查询效率显著提高。问题在于Oracle未选择更优的执行计划,可能是由于统计信息不准确或列倾斜度导致。通过对表收集直方图,Oracle选择了Hash Join,从而解决了问题。
摘要由CSDN通过智能技术生成

今天,某省的同事来告诉我,表重组后,他用于统计的一个sql脚本运行变慢了,之前只需要17、8分钟能出来的结果,现在1小时40分钟左右才能出来结果。

我们一起来看看脚本中的一个sql:

SQL >  explain   plan   for
  
2    select   a . startdate , b . subsid   from   tab_1   a , tab_2   b   where  
  
3    a . servid = ' 025001003681 '   and   a . status != ' C '   and   a . mid = b . mid ;
 
Explained .
 
Elapsed :  00 : 00 : 00.03
 
SQL >  select  *  from   table ( dbms_xplan . display )
SQL > /
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--
 

--------------------------------------------------------------------------------------------------------------
--
| Id  | Operation                           |  Name                    | Rows  | Bytes | Cost  | Pstart| Pstop |

--------------------------------------------------------------------------------------------------------------
--
|   0 | SELECT STATEMENT                    |                          |   369 | 23985 |   980 |       |       |

|   
1    NESTED   LOOPS                        |                          |    369  |  23985  |    980  |       |       |
|   
2  |    PARTITION   HASH   ALL                 |                          |       |       |       |      1  |      4  |
|*  
3  |     TABLE   ACCESS   BY   LOCAL   INDEX   ROWID |  tab_1              |    369  |  14022  |    242  |      1  |      4  |
|*  
4  |      INDEX   RANGE   SCAN                 |  IDX_tab_1_SERVID   |    492  |       |     10  |      1  |      4  |
|   
5  |    PARTITION   HASH   ITERATOR            |                          |       |       |       |    KEY  |    KEY  |
|   
6  |     TABLE   ACCESS   BY   LOCAL   INDEX   ROWID |  tab_2                |      1  |     27  |      2  |    KEY  |    KEY  |
|*  
7  |      INDEX   UNIQUE   SCAN                |  PK_tab_2_MID         |      1  |       |      1  |    KEY  |    KEY  |
--------------------------------------------------------------------------------------------------------------
--
 

Predicate   Information   ( identified   by   operation   id ) :
-------------------------------------------------
--
 

   
3  -  filter ( " A " . " STATUS " <> ' C ' )
   
4  -  access ( " A " . " SERVID " = ' 025001003681 ' )
   
7  -  access ( " A " . " MID " = " B " . " MID " )
 
Note :  cpu   costing   is   off
 
22   rows   selected .
 
Elapsed :  00 : 00 : 00.56

我们看到这个sql是通过索引后在走nested loops,我们做一个sqltrace来观察一下它的执行时间和consistent gets:

SQL >  set   timing   on
SQL >  set   autotrace   traceonly
SQL >  select   a . startdate , b . subsid   from   tab_1   a , tab_2   b   where  
  
2    a . servid = ' 025001003681 '   and   a . status != ' C '   and
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值