我们希望加快下面的插入声明。现在需要大约1个多小时才能完成。
PM表包含大约79M条记录,F1有4.8M条记录,RESULT包含80M条记录。
任何想法如何加快速度?
insert /*+ PARALLEL(16) APPEND NOLOGGING */ into MATCH_DATE(ID1, ID2)
select /*+ PARALLEL(16) */ T1.ID ID1, T2.ID ID2
from PM T1, F1 T2, RESULT
where RESULT.RECON_PM_ID = T1.ID
and RESULT.STATUS in (:ZERO, :TWO)
and RESULT.RECON_CONFIG_ID = :RECON_CONFIG_ID
and T1.UPLOAD_DT >= sysdate - :ONE
and RESULT.CREATE_DT >= sysdate - :SIXTY
and RESULT.RECON_F1_ID is null
and T2.STATUS = :ZERO
and T2.UPLOAD_DT >= sysdate - :ONE
and T1.TRAN_DT between T2.TRAN_DT - :ASDF
and T2.TRAN_DT + :ASDF
and T1.CHARGING_NO = T2.CHARGING_NO
and T1.USAGE_TYPE = T2.USAGE_TYPE
以下是Enterprise Manager的执行统计信息:
答案 0 :(得分:0)
当您在同一个表上有多个谓词时,常规表统计信息的价值有限,因此请确保正在调用优化程序动态抽样。一个常规的解释计划会告诉你,默认情况下我认为11g将调用该查询的动态采样,但如果没有,那么预期的基数将是不准确的。
我也避免对类似的查询使用绑定变量 - 变量值的变化可能意味着完全不同的计划将是有益的,并且在多分钟查询的上下文中硬解析时间不会是一个重大问题。