oracle GTT против литералов предложения IN - PullRequest
0 голосов
/ 30 апреля 2020

Иметь один запрос, где GTT (несколько 100 записей) внутренне соединены с основной таблицей.

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

Запрос занимает около 15-20 минут для загрузки в table1, но когда я передаю значение таблицы GTT в коде hardcode в запросе, он завершается через 4-5 минут.

в чем здесь основное отличие, есть ли способ улучшить производительность с помощью GTT (нельзя избежать GTT, потому что иногда значения могут быть больше 1000)

Пробовал ниже 1. удалено внутреннее присоединитесь и замените предложением IN (где IN (выберите идентификатор из GTT), но не повезло 2. добавили push_subq и удалите HINT с подзапросом (вариант 1), но не повезло

PLAN


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%


1 Ответ

0 голосов
/ 30 апреля 2020

Ну, это всего лишь выстрел в темноте. Если бы вы могли ответить на мои комментарии, можете импровизировать.

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.

...