首页 > 解决方案 > oracle GTT Vs IN 子句文字

问题描述

有一个查询,其中 GTT(few 100 Recs) 内部与主表连接。

ex :
insert into table1 select col2,col3 from gtt,maintable where gtt.id=maintable.id    .. few other joins 

查询大约需要 15-20 分钟才能加载到 table1,但是当我在查询中传递那些 GTT 表值硬编码时,它将在 4-5 分钟内完成。

这里的主要区别是什么,有什么方法可以提高使用 GTT 的性能。(不能避免 GTT,因为有时值可能超过 1000)

在下面尝试 1. 删除了内部连接并用 IN 子句替换( where IN ( 从 GTT 中选择 id ),但没有运气 2. 添加 push_subq 和 unnest HINT with subquery(option 1) ,但没有运气

计划


with GTT

|  74 | NESTED LOOPS                      |                           
|  75 |  BUFFER SORT                      |                           
|  76 |   PX RECEIVE                      |                           
|  77 |    PX SEND BROADCAST              | :TQ20006                  
|  78 |     SORT UNIQUE                   |                           
|  79 |      PX RECEIVE                   |                           
|  80 |       PX SEND HASH                | :TQ20005                  
|  81 |        PX BLOCK ITERATOR          |                           
|  82 |         TABLE ACCESS STORAGE FULL | STAGE_GTT    
|  83 |  PX PARTITION HASH ITERATOR       |                           
|  84 |   TABLE ACCESS STORAGE FULL       | EXP_TABLE                 =====>103GB == cell offloaded 95%  




With literal 

 129 |  PX SEND HASH                          | :TQ20006              
 130 |   HASH JOIN                            |                       
 131 |    PX PARTITION HASH INLIST            |                       
 132 |     VIEW                               |                       
 133 |      TABLE ACCESS STORAGE FULL         | EXP_TABLE       ====(27GB ) ==cell offloaded 98%


标签: plsqloracle11g

解决方案


好吧,这只是在黑暗中的一个镜头。如果你能回应我的评论,可以即兴发挥。

insert into table1 select col2,col3 from gtt 
        where exists (select 1 from maintable 
                      where gtt.id=maintable.id    
                      .. few other joins)

假设:col2,col3 来自gtt。


推荐阅读