【问题标题】:Update/Insert 15 million records in oracle database在 oracle 数据库中更新/插入 1500 万条记录
【发布时间】:2016-09-26 19:33:43
【问题描述】:

我的项目有一个要求是在做一些验证后在一个表中插入 1500 万条记录,这应该在 20 分钟内完成。

源表是一个从其他应用程序接收数据的临时表。现在,从这个临时表中,我们必须在验证后将数据插入到其中一个基表中。当这个过程结束时,我们必须将 staging 表中的记录插入到两个单独的历史表中。

第一次插入的时间应该是 20 分钟。 接下来两次插入的总时间应该是 20 分钟。

同一个数据库中的所有四个表,在同一个模式中。 我在案例 1 中使用 Pro*C 进行验证,但在第二次插入中有一个 plsql 包。

谁能帮我提些建议,数据库是oracle 9i。另外20分钟内最多可以处理多少条记录?

【问题讨论】:

  • 行来自哪里?您是否真的在使用 Oracle 9i,这个版本至少有 5 个主要修订版本并且多年来一直不受支持?你今天到底是怎么做的?这里有很多可能的架构似乎绰绰有余。 Oracle 定期进行演示,在 1 小时的演示中,他们将 TB 数据加载到在 Exadata 机器上运行的数据仓库中。
  • 嗨贾斯汀。这些行通过 ETL 工具来自另一个应用程序。是的,我们使用的是 9i,因为整个系统太旧了。为了我的测试目的,我只是通过我自己的测试数据准备脚本手动插入任何记录。如果需要其他信息,请告诉我。
  • 仅供参考今天我尝试在桌子上使用 DOP 10,仅插入一张桌子花了 19 分钟。但是由于大量批处理在夜间运行,我们无法进行大量并行处理。
  • 好的,所以有一个ETL工具。什么工具?该工具是否在进行基于集合的操作?还是逐行操作?它会将所有数据拉到运行 ETL 工具的机器上吗?还是在数据库中操作?在数据库中从一个表到另一个表的基于集合的插入应该非常快。
  • 该工具整天将数据插入到我们的临时表中。晚上,我们必须为上述流程运行 2 批。抱歉,我没有太多关于您提出的关于插入我们的数据库的问题的信息,因为我们主要关心的是从暂存表中获取数据并在每个 20 分钟内处理。

标签: plsql parallel-processing proc oracle9i


【解决方案1】:

这取决于您需要处理的数据类型。我不知道这在 9i 中需要多少时间,我使用 11g(廉价笔记本电脑上的免费版),下面的插入(15,000,000 个非常简单的行,单个数字列)用了不到 20 秒:

SQL> create table a ( col number );

Table created.
Elapsed: 00:00:00.02

SQL> insert into a
  2  select u.x + v.y
  3  from            (select level x from dual connect by level <= 15000) u
  4       cross join (select level y from dual connect by level <=  1000) v;

15000000 rows created.    
Elapsed: 00:00:19.46

SQL> commit;

Commit complete.

SQL> select count(*) from a;

  COUNT(*)
----------
  15000000

1 row selected.    
Elapsed: 00:00:01.36

【讨论】:

  • 感谢数学家,但我必须将数据从一个表转移到另一个表
  • @SinghGaurav - 这正是您需要分享更多细节的原因。插入“数字”是一回事,插入 3000 个字符串是另一回事。动态生成条目是一回事,从八个表的连接中获取它们是另一回事。等等。我看到你添加了更多细节,但恐怕这还不够。
  • 让我知道需要哪些详细信息。我会尝试分享它们。
【解决方案2】:

最后,我们决定使用多线程并行插入两个历史表,这是一个简单的 INSERT 查询。 对于第二种情况,Pro*C 正在逐条处理每条记录,因此无法在给定时间内完成。我们仍然在 Pl/SQL 部分实现了不会阻碍其他进程的最大线程数和一定程度的并行性。

谢谢大家的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多