Я оставил соединение 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