将大量数据加载到Oracle SQL数据库

时间:2010-06-07 19:27:00

标签: sql oracle insert bulkinsert sql-loader

我想知道是否有人对我即将开始的事情有任何经验。我有几个csv文件大小都在GB左右,我需要将它们加载到oracle数据库中。虽然我加载后的大多数工作都是只读的,但我还是需要不时加载更新。基本上我只需要一个很好的工具来一次加载几行数据直到我的数据库。

这是我到目前为止所发现的:

  1. 我可以使用SQL Loader做很多工作

  2. 我可以使用批量插入命令

  3. 某种批量插入。

  4. 以某种方式使用预备语句可能是个好主意。我想我想知道每个人都认为这是完成插入的最快方法。有什么提示吗?

3 个答案:

答案 0 :(得分:5)

如果您能够推出自己的效果优于SQL*Loader Direct Path Loads,我会感到非常惊讶。 Oracle为此目的构建了这个实用程序 - 构建更高效的东西的可能性实际上是零。还有Parallel Direct Path Load,它允许您同时运行多个直接路径加载进程。

从手册:

  

而不是填充绑定数组缓冲区   并将其传递给Oracle数据库   使用SQL INSERT语句,直接   路径加载使用直接路径API   传递要加载到负载的数据   服务器中的引擎。负载引擎   从中构建列数组结构   传递给它的数据。

     

直接路径加载引擎使用   用于格式化的列数组结构   Oracle数据块和构建索引   键。新格式化的数据库   块直接写入   数据库(每个I / O多个块   请求使用异步写入   主机平台支持   异步I / O)。

     

在内部,使用多个缓冲区   对于格式化的块。一个人   正在填充缓冲区,一个或多个   正在编写缓冲区   异步I / O可用于   主机平台。重叠计算   使用I / O可以提高负载性能。

有些情况下直接路径加载cannot be used

答案 1 :(得分:0)

有了这么多数据,你最好确定你的后备存储 - dbf磁盘的可用空间。

sqlldr是脚本驱动器,非常高效,通常比sql脚本更有效。 我唯一想知道的是数据的大小。我个人会考虑几个到多个sqlldr进程,并为每个进程分配一个数据子集,让进程并行运行。

你说你想一次加载几条记录?这可能比你想象的要长很多。你一次是指几个文件吗?

答案 2 :(得分:0)

您可以在CSV文件上创建一个外部表,并通过从外部表中选择另一个表来加载它们。然而,这种方法是否会更快更不确定可能会更快地使得sql *加载器工作,特别是当你有UPDATE标准时。