【发布时间】:2018-08-26 01:16:29
【问题描述】:
我有一个场景,我需要将 5 亿行从 Table1 复制到 Table2。几点,
- Table1 有 20 亿行。
- Table2 是一个新表,与 Table1 相同。
- Table1 和 Table2 都是 List 分区类型。
- 两个表必须在同一个表空间中,并且表空间是用 LOGGING 模式创建的。
- TABLESPACE 块大小为:8192,FORCE_LOGGING NO,AUTO EXTEND ON。启用重做存档
所以,这就是我进行此活动的方法,我要求提供建议以改进或防止一些突然出现的不需要的情况。
- 创建具有相同结构的 Table2,没有任何索引或 PK。
- 更改表 2 不记录; -- 将表置于 NOLOGGING 模式以停止重做生成。这样做只是为了提高性能。
- 在 50 个并行作业中执行此活动(基于分区列创建的作业)。分区列有 120 个不同的值。所以总共有120个工作。前 50 个将被发布,1 个完成后,第 51 个将被发布,依此类推。
- 使用游标,批量获取,限制为 5000,FORALL 用于插入(带有 APPEND 提示)。 1 次迭代后立即提交,因此提交频率为 5000。
- 所有作业完成后,将 Table2 重新置于 LOGGING 模式。 更改表 Table2 日志记录;
- 在启用并行模式的 Table2 上创建所有必需的索引和 PK,然后更改索引 NOPARALLEL。
有什么建议吗?非常感谢您的宝贵时间。
【问题讨论】:
-
第一个建议 - 将此问题提交给dba.stackexchange.com,因为它在这里是题外话。第二个建议,正确配置为利用可用硬件并行性的数据库服务器不需要执行 50 个并行作业。让所有精美的 Oracle 数据库服务器软件为您完成并行工作。
-
@MichaelO'Neill 这个问题是关于编程的,不是题外话。在某些组织中,应用程序 DBA 会执行此类任务,但在许多组织中,操作 DBA 不知道如何执行此操作。但我同意你关于让 Oracle 完成并行工作的观点。