Оптимизировать запрос на вставку Oracle - PullRequest
0 голосов
/ 08 января 2019

Привет мне нужно оптимизировать ниже SQL запрос.

insert into exa_table (column1, column2, column3, column4)
select value1, value2, value3, value4 from 
(select tb2.ID, tb2.PARCELNO, tb2.SHP_ID, tb4.CUST_ID
from exa_table2 tb2 
join table3 tb3 on tb2.ID = tb3.ID 
join table4 tb4 on tb3.ID = tb4.ID 
where tb2.STATUS='1' and tb2.ACTIVE='1' and tb2.DATE >= '20180924' AND tb2.SDATE < '20181024' and 
tb4.STATUS='1' and tb4.ACTIVE='1' and 
not exists (select 1 from exa_table Q where Q.ID = tb2.ID));

Я уже пытался оптимизировать запрос, добавив APPEND NOLOGGING и PARALLEL, как это

insert /*+ APPEND NOLOGGING */ into exa_table (column1, column2, column3, column4)
select value1, value2, value3, value4 from 
(select /*+ PARALLEL(4) */ tb2.ID, tb2.PARCELNO, tb2.SHP_ID, tb4.CUST_ID
from exa_table2 tb2 
join table3 tb3 on tb2.ID = tb3.ID 
join table4 tb4 on tb3.ID = tb4.ID 
where tb2.STATUS='1' and tb2.ACTIVE='1' and tb2.DATE >= '20180924' AND tb2.SDATE < '20181024' and 
tb4.STATUS='1' and tb4.ACTIVE='1' and 
not exists (select 1 from exa_table Q where Q.ID = tb2.ID));

Теперь все намного лучше, но все еще не достаточно - потребовалось 13 минут, чтобы вставить ~ 100 тыс. Строк

План объяснения: enter image description here

У вас есть идеи, как улучшить запрос?

1 Ответ

0 голосов
/ 09 января 2019

В зависимости от плана выполнения, который вы указываете, узкое место находится в операторе SELECT. Вы не ответили о селективности выбора, поэтому я предполагаю, что она ниже 5%, и поэтому вам следует использовать индекс.

Я бы начал с создания следующего индекса:

create index ix1 on exa_table2 (STATUS, ACTIVE, DATE, SDATE, ID);

Если селективность низкая, этот показатель улучшит производительность. Попробуйте сначала БЕЗ какого-либо параллелизма, чтобы увидеть, насколько хорошо он работает. Как только вы обнаружите, что он работает хорошо, вы можете добавить больше оборудования.

Кроме того, очень важно выяснить отдельные (отдельные) селективности для каждого из следующих условий фильтрации:

  • STATUS = '1'
  • ACTIVE = '1'
  • DATE >= '20180924'
  • SDATE < '20181024'

Порядок столбцов во вновь созданном индексе может быть весьма значительным для производительности запроса, и он сильно зависит от этой селективности.

...