sql - Oracle 11g - 如何优化慢速并行插入选择?

标签 sql performance oracle parallel-processing oracle11g

我们想加快下面并行插入语句的运行。我们预计插入大约 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 计划统计信息。我们还注意到这些语句没有并行运行。这是正常的吗?

insert-select plan statistics from oracle em

编辑:顺便说一句,序列已经缓存到 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/

相关文章:

sql - DynamicSQL 使用 sp_executesql 错误

mysql - 选择与最旧条目匹配的所有条目

sql - 选择分页连接行以可靠地限制不同的相关行

sql - PLI 关键字的用途是什么?

sql - 如何修复错误 "Catastrophic failure. Cannot fetch a row from OLE DB provider "OraOLEDB.Oracle“for linked server”

performance - 如何使用 Memcached 配置 NGINX 以提供 HTML

c++ - 将十亿整数初始化为值 1

c# - 为什么我的应用程序随着时间的推移变得响应速度变慢?

database - Oracle - 表名和列 - 我可以更改大小写吗?

sql - 从 Oracle 表中删除除最旧的所有重复记录