【问题标题】:How to bulk insert in Oracle如何在 Oracle 中批量插入
【发布时间】:2014-07-03 06:46:20
【问题描述】:

我必须将大量数据从一个数据库实例加载到另一个数据库实例,要求是仅使用 DBlinks。

使用 SQLLDR 我能够达到每秒 200K 记录的速度,并希望使用 DBLinks 复制相同的记录。

使用直接路径插入(附加提示)每秒最多可提供 40k 条记录。 但由于使用直接路径插入获取表级别,我无法打开多个会话将其扩展到 200K。

由于常规插入非常慢,我可能必须打开 30 到 40 个会话才能满足所需的速度。有没有办法实现并行直接路径插入同一张表?或者有没有其他方法或数据库调整哪些可以帮助我增加每秒插入次数?

注意:我已经尝试过分区表并且锁仍然在表上而不是在分区上。

【问题讨论】:

  • 建议直接加载到远程数据库。因此,您可以将数据下载到文件中,并使用数据文件直接加载到其他数据库中。使用 PARALLEL 可以通过打开多个 SQL 加载器会话来加快进程。
  • 你可以在你的数据库链接上使用数据泵 API 吗?
  • 取决于要传输的数据的总大小,当您考虑卸载源数据库中的数据、序列化到磁盘、通过网络传输文件所花费的时间时,性能实际上是相当的等等。
  • 我尝试增加并行度,但对吞吐量没有太大好处。

标签: sql database oracle


【解决方案1】:

我通过使用带有分区子句的插入附加找到了解决方案。 如果插入子句包含分区信息,则锁在分区上,而不是在表上。

这样写查询:

Insert /*+ append */ into destination partition(ptnName) select * from source@dblink where(分区过滤条件)。

我在目标表中创建了 8 个分区并启动了 8 个会话以加载到各个分区。它获得了与 SQLLDR 速度相匹配的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-17
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2014-06-22
    相关资源
    最近更新 更多