Вставить в стать очень медленно после добавления левого соединения. В чем может быть проблема? - PullRequest
2 голосов
/ 27 июня 2019

Я оставил соединение 5 таблиц и вставил результат выбора в мою целевую таблицу, 200 000 записей стоили 30 с, прежде чем я добавлю новое левое объединение в утверждение. Однако после добавления нового левого соединения оператор sql не может завершиться после выполнения в течение 1 часа. Новая правая таблица остается одной из предыдущих 5 таблиц.

Обычный оператор sql: 200 000 записей стоит 30 с

insert into SCHEMA1.T_AGRGT_INFO(
50 columns...
)
select
50 columns...
from
(select * from TB1@DB) T1 --about 200,000 records
left join
(select * from SCHEMA1.TB2) T2 --about 500,000 records
on T1.COL1 = T2.COL1 
left join
(select
    COL1,COL2,COL3,COL4,COL5
from
    (select COL1,COL2,COL3,COL4,COL5,
        row_number()  over(partition by COL1 BY COL2 DESC) NUM
    from SCHEMA2.TB3@DB  
) T
where T.NUM = 1) T3  --about 50,000 records
on T1.COL1 = T3.COL1 
left join
(select
    COL1,COL2,COL3,COL4,COL5
from
    (select COL1,COL2,COL3,COL4,COL5,
        row_number()  over(partition by COL1 BY COL2 DESC) NUM
    from SCHEMA2.TB4   
) T
where T.NUM = 1) T4 --about 50,000 records
on T2.COL2 = T4.COL1  
left join
(select
    COL1,COL2,COL3,COL4,COL5
from
    (select COL1,COL2,COL3,COL4,COL5,
        row_number()  over(partition by COL1,COL2,COL3 BY COL4 DESC) NUM
    from SCHEMA2.TB5   
) T
where T.NUM = 1) TB5    --about 50,000 records
on T2.COL2 = T5.COL1;

все левые объединения не реплицируют записи, общее количество записей в операторе равно 'select count (*) from T1 @ DB'. TB1, TB3 доступны через dblink, TB4, TB5 находятся в другой схеме.

Ненормальное утверждение: 200 000 записей не могут завершиться после запуска в течение 1 часа

--all the same except for adding a left join
left join
(select
    COL1,COL2,COL3,COL4,COL5
from
    (select COL1,COL2,COL3,COL4,COL5,
        row_number()  over(partition by COL1 BY COL2 DESC) NUM
    from SCHEMA2.TB4   
) T
where T.NUM = 2) T4_1   --about 15,000 records
on T2.COL2 = T4_1.COL1 

Я только что добавил левое соединение, повторно используя TB4, производительность сильно упала. В чем может быть проблема? Как это решить?

пс: Oracle DB

1 Ответ

1 голос
/ 27 июня 2019

Я не знаю, почему добавление вторых строк из t4 замедляет работу, и без доступа к данным и планов выполнения мы не сможем многое сделать, я полагаю.

Но есть одна вещь, которую вы можете попробовать. Здесь вы используете тот же код, поэтому переместите его в предложение with, затем дважды включите эту часть в ваш основной запрос, используя rn = 1 и rn = 2. Упрощенный код, без t3 и t5:

with t4 as (
    select * 
      from (select col1,col2,col3,col4,col5,
                   row_number() over (partition by col1 order by col2 desc) rn
              from tb4 )
      where rn <= 2 )
select * 
    from tb1 t1                                               
    left join tb2 t2 on t2.col1 = t1.col1                     
    left join t4 t4a on t4a.col1 = t2.col2 and t4a.rn = 1    
    left join t4 t4b on t4b.col1 = t2.col2 and t4a.rn = 2    
...