Oracle 19 INSERT 50M 行需要 400 秒

问题描述 投票:0回答:1

我们有以下 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 上有主键。

oracle-database
1个回答
0
投票

你不喜欢这个表演吗?

这是一次性工作还是您的目标是每次插入 50M 记录? 插入 50m 记录而不提交,并不是使用 Redo 可以做到的最好主意。 还有你们在哪张桌子上PK?表1还是表2? 对 varchar 数据类型列进行 PK 有何意义?这种解决方案可能会存在性能问题,因为 varchar 列上的索引和查找操作通常比数字列上慢,因为字符串比较 + 验证开销,从长远来看,它将花费更多存储空间......

所以我建议在每插入 10K - 50K 条记录后提交......也许这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.