我们想加快下面并行插入语句的运行。我们预计插入大约 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
最佳答案
改进统计。 估计行数为 1,但实际行数超过 700 万,并且还在增加。这会导致执行计划使用嵌套循环而不是哈希连接。嵌套循环更适合少量数据,散列连接更适合大量数据。解决这个问题可能就像确保相关表具有准确的最新统计信息一样简单。这通常可以通过使用默认设置收集统计信息来完成,例如:exec dbms_stats.gather_table_stats('SIRS_UATC1', 'TBL_RECON_PM');
.
如果这不能改善基数估计,请尝试使用动态采样提示,例如 /*+ dynamic_sampling(5) */
.对于这样一个长时间运行的查询,如果它会导致更好的计划,那么值得花一点额外的时间预先采样数据。
使用语句级并行而不是对象级并行。 这可能是并行 SQL 最常见的错误。如果您使用对象级并行,则提示必须引用对象的别名。从 11gR2 开始,无需担心指定对象。该语句只需要一个提示:INSERT /*+ PARALLEL(16) APPEND */ ...
.请注意 NOLOGGING
不是真正的暗示。
关于sql - Oracle 11g - 如何优化慢速并行插入选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20047610/