【问题标题】:Copy data from a table and load it into another table从表中复制数据并将其加载到另一个表中
【发布时间】:2013-07-09 16:01:57
【问题描述】:

我有一个有 40 列的表“A”。我需要将数据从 'A' 的 20 个特定列复制到另一个具有这 20 列的表 'B'。将有大约 3 到 1000 万条记录。 在 PLSQL 中执行此操作的最有效方法是什么。

【问题讨论】:

  • 为什么选择 PL/SQL,为什么不直接使用 SQL insert into ... select ...
  • 您选择的标签表明您已经有了答案。您对我们有什么期待?
  • 是的,我使用 BULK COLLECT 和 FORALL 实现了它。我想知道有什么办法可以调整它以提高效率。
  • @cool_mo 是的,你可以改进。使用 SQL 语句。如果必须,从 PL/SQL 块运行它,它会正常工作。
  • @ the_slk 所以 INSERT INTO SELECT A.c1 , A.c2 from A (in a PLSQL block) ,这会比在 PLSQL 块中使用 BULK COLLECT 更有效吗?

标签: sql oracle plsql forall bulk-collect


【解决方案1】:

"每日表B将被截断并插入新数据 来自 A。”

好的,所以最有效的方法就是不这样做。改用物化视图;表 A 上的物化视图日志将允许您捕获增量更改并每天或在您喜欢的任何其他窗口应用它们。 Find out more.

与使用手动 PL/SQL(甚至纯 SQL)的方法相比,效率低得可笑。

【讨论】:

    【解决方案2】:

    您需要对数据进行任何类型的转换,还是只是将数据直接从一个表复制到另一个表?

    执行此操作的最简单方法是,尽管您必须单独创建索引。

    create table B as (select A.c1, A.c2, A.c3..... from A);
    

    如果表 x 已经存在,你可以做一个

    insert into B select A.c1, A.c2.... from A
    

    为了加快速度,您需要删除表 x 上的所有索引,直到插入完成。

    【讨论】:

    • 不,不涉及数据排序,只需将数据复制到B。每日表'B'将被截断并添加新数据。那么这将是最有效的方法 1)插入 B 选择或 2)BULK COLLECT
    • 我从未做过性能测试。这是一次性工作吗?
    • 我尝试使用 INSERT INTO ,但是如果我必须在每插入 50000 行后进行一次提交,我该怎么办?
    • 没有。每日表 B 将被截断,新数据将从 A 插入其中。
    • 那么,您应该进行一次试运行。应该不会花太长时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2018-07-10
    • 2012-11-24
    • 2011-11-21
    • 2023-03-16
    相关资源
    最近更新 更多