我离开了5个表,并将选择结果插入到我的目标表中, 在该语句中添加新的左联接之前,200,000条记录耗时30s。但是,添加新的左联接后,运行1h后sql语句无法完成。 新的右侧表格仍然是前5个表格之一。
常规sql语句:200,000条记录耗时30s
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;
所有左联接不复制记录,该语句中的记录总数等于“ T1 @ DB中的select count(*)”。 dblink访问TB1,TB3,TB4,TB5在另一个模式中。
异常声明:运行1h后无法完成200,000条记录
--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添加了一个左联接,性能大大下降了。 可能是什么问题呢?如何解决?
ps:Oracle数据库
答案 0 :(得分:1)
我不知道为什么从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