我们有以下 SQL:
INSERT /*+ ENABLE_PARALLEL_DML PARALLEL(16) */ INTO TABLE2 SELECT col1, col2 FROM Table1;
Table1为主表。 Table2 是备份表,为空。 我们只从 Table1 中 SELECT 2 列并 INSERT INTO table2 但在 Oracle 19 下需要 400 秒才能完成。 我检查 gv$active_session_history 并看到许多类似这样的事件:
select sample_time, sql_opname, event, wait_class from v$active_session_history where SQL_opname like 'INSERT%'
SQL_OP EVENT WAIT_CLASS
INSERT buffer busy waits Concurrency
INSERT buffer busy waits Concurrency
INSERT buffer busy waits Concurrency
INSERT buffer busy waits Concurrency
INSERT buffer busy waits Concurrency
顺便说一句 Table2 ,col1 是 14 字节 varchar,col2 是整数。我们在 Col1 上有主键。
你不喜欢这个表演吗?
这是一次性工作还是您的目标是每次插入 50M 记录? 插入 50m 记录而不提交,并不是使用 Redo 可以做到的最好主意。 还有你们在哪张桌子上PK?表1还是表2? 对 varchar 数据类型列进行 PK 有何意义?这种解决方案可能会存在性能问题,因为 varchar 列上的索引和查找操作通常比数字列上慢,因为字符串比较 + 验证开销,从长远来看,它将花费更多存储空间......
所以我建议在每插入 10K - 50K 条记录后提交......也许这会有所帮助。