添加左联接后,插入变得非常慢。可能是什么问题?

时间:2019-06-27 05:54:21

标签: sql oracle sql-insert

我离开了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数据库

1 个答案:

答案 0 :(得分:1)

我不知道为什么从t4开始添加第二行会导致速度变慢,并且我想如果没有数据访问和执行计划,我们做不到。

但是您可以尝试一件事。您在此处使用相同的代码,因此将其移至with子句,然后使用rn = 1rn = 2将这一部分两次连接到您的主查询中。不含t3t5的简化代码:

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