【问题标题】:Oracle: What is the difference between array binding and sql loader?Oracle:数组绑定和sql loader有什么区别?
【发布时间】:2014-08-22 05:47:05
【问题描述】:

我使用 bcp(sybase 批量插入)插入数百万条记录,但我的公司正在迁移到 oracle。

我不确定我应该使用数组绑定还是 sql 加载器。我在内存中有很多数据。我可以 1. 使用数据创建一个文本文件并使用 sql-loader 插入它,或者 2. 使用数组绑定库插入数据。我不确定哪个对我的应用程序更实用。一个和另一个有什么区别。对某些应用程序更好吗?

我应该用哪个来代替 bcp?

【问题讨论】:

  • 我认为您无法比较这些。 sql-loader 是一个独立的 Oracle 工具,用于解析和批量加载文本文件,数组绑定是一种减少网络往返(或上下文切换,如果您在 pl/sql 中使用它)的编程方法。
  • 所以如果我需要将 400 万条记录插入到具有 8 亿条记录的表中,两者应该具有相当的性能?
  • 基本上我在内存中有很多数据。我可以 1. 使用数据创建一个文本文件并使用 sql-loader 插入它,或者 2. 使用数组绑定库插入数据。我不确定哪个更适合我的应用程序。
  • 我希望默认情况下 sql-loader 更快,因为它使用(或至少尝试)直接路径写入,而您的平均插入通过缓冲区缓存以传统方式进行。然而,直接路径并不总是可行的

标签: oracle oracle11g sybase bcp sql-loader


【解决方案1】:

SQL*Loader 是 bcp 最直接的替代品。如果您有一个使用 bcp 的现有进程,那么迁移到 SQL*Loader 可能是阻力最小的路径。

你说你已经有内存中的数据了。我假设这意味着数据在客户端计算机上的内存中,而不是在数据库服务器上。鉴于这个起点,我通常更喜欢direct path load,假设您使用的任何数据库访问 API 都提供直接路径 API。产生将一堆数据写入文件的开销,只是为了让 SQL*Loader 产生从磁盘读取数据的开销,只是为了使用(假设你设置它这样做)加载数据的直接路径 API 应该降低 SQL*Loader 的效率。当然,作为一个专门构建的工具,SQL*Loader 解决方案很可能比您编写自己的代码更快地拼凑在一起并获得可接受的性能,尤其是在您刚刚学习 API 的情况下。

如果您无法访问直接路径 API,并且您在使用数组绑定执行常规路径加载的应用程序或执行直接路径加载的 SQL*Loader 解决方案之间争论不休,那么问题就更接近了。您可能需要对两者进行基准测试。直接路径加载比传统路径加载更有效。但是将所有数据写入磁盘并将其全部读回会产生额外的成本。将数据读取和写入磁盘的成本是否超过直接路径负载的好处将取决于特定于您的应用程序的各种因素(数据量、磁盘速度、网络 I/O 等)。

要考虑的另一个选项可能是将文件写入磁盘,将文件复制到数据库服务器,然后使用外部表将数据公开给数据库。这通常比在客户端机器上使用 SQL*Loader 更有效。它是否比来自应用程序的直接路径加载执行得更好,以及编写文件、移动它们以及通常将控制从应用程序转移到操作系统实用程序并返回到应用程序的额外复杂性是否超过了编写更多文件的复杂性应用程序中的代码需要您自己回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 2012-12-02
    • 2012-05-25
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多