【发布时间】:2013-12-01 14:13:39
【问题描述】:
我们想加快下面并行插入语句的运行。我们预计插入大约 80M 条记录,大约需要 2 小时才能完成。
INSERT /*+ PARALLEL(STAGING_EX,16) APPEND NOLOGGING */ INTO STAGING_EX (ID, TRAN_DT,
RECON_DT_START, RECON_DT_END, RECON_CONFIG_ID, RECON_PM_ID)
SELECT /*+PARALLEL(PM,16) */ SEQ_RESULT_ID.nextval, sysdate, sysdate, sysdate,
'8a038312403e859201405245eed00c42', T1.ID FROM PM T1 WHERE STATUS = 1 and not
exists(select 1 from RESULT where T1.ID = RECON_PM_ID and CREATE_DT >= sysdate - 60) and
UPLOAD_DT >= sysdate - 1 and (FUND_SRC_TYPE = :1)
我们认为缓存不存在列的结果会加快插入速度。我们如何执行缓存?有什么想法可以加快插入速度吗?
有关 Enterprise Manager 的计划统计信息,请参阅下文。我们还注意到这些语句没有并行运行。这正常吗?
编辑:顺便说一句,序列已经缓存到 1M
【问题讨论】:
-
优化查询和优化插入是不同的事情。优化您已经使用的插入
append nologging- 尝试缓存序列以节省更多时间ALTER SEQUENCE SEQ_RESULT_ID CACHE 1000; -
序列已经缓存到1M,但还是很慢。还有什么想法吗?
-
pm和result中有多少行?您选择的百分比是多少? -
pm 表包含 79227256 条记录,而结果表包含 24 条记录。我们选择了每个人的近 99%。
-
@haki
nologging不是真正的提示。但这不应该阻止append工作。
标签: sql performance oracle parallel-processing oracle11g