【发布时间】:2013-12-02 15:14:35
【问题描述】:
我们想加快下面的插入语句。目前大约需要 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
这是来自企业管理器的执行统计数据:
【问题讨论】:
-
PM 表上有哪些索引?有趣的是,它执行 78M 的 INDEX UNIQUE SCAN,然后在检索 82M 的同一个表上执行 TABLE ACCESS BY GLOBAL - 这意味着它可能值得在 PM 上创建一个涵盖所有所需字段的索引。事实上,值得在所有涉及的表上发布索引。
-
这和你的last question非常相似;答案几乎相同。您选择了几乎 100% 的所有表,但您使用的是嵌套循环和一些索引扫描。作为jonearles suggested;更新您的统计信息,以便您使用散列连接(并希望完全扫描表)并使用语句级别而不是对象级别并行。
标签: sql performance oracle parallel-processing oracle11g