2010-06-07 103 views
3

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

这是我迄今发现:

  1. 我可以使用SQL装载机做T了很多的工作

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

  3. 一些种类的批量插入。

以某种方式使用准备好的语句可能是一个好主意。我想我很想知道大家认为什么是最快完成插入的方法。有小费吗?

回答

5

我会感到非常惊讶,如果你能推出自己的实用工具,将超越SQL*Loader Direct Path Loads。 Oracle为此正好建立了这个工具 - 构建更高效率的可能性实际上是零。还有Parallel Direct Path Load,它允许您有多个直接路径加载进程并发运行。

从手册:

代替填充绑定数组缓冲器 ,并将其与SQL INSERT语句传递Oracle数据库 ,直接 路径负载使用直接路径API来 通过将数据加载到服务器中的负载 引擎中。负载引擎 根据传递给它的数据从 构建列阵列结构。

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

在内部,多个缓冲器用于 的格式块。当一个 缓冲区正在填充时,如果在 主机平台上有 异步I/O,则正在写入一个或多个 缓冲区。用I/O重叠计算 可以提高负载性能。

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

+0

+1优秀的答案 – 2010-06-08 11:21:29

0

随着数据的量,你最好确保你的后备存储的 - 的DBF磁盘的可用空间。

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

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

+0

我已经将数据分成几个文件,目的是让事情平行进行。我一直在想,在一段时间内管理几条记录会更快......因为我不必为每条记录而花费与服务器交互的开销。 – James 2010-06-07 19:52:31

+1

@詹姆斯 - 固定宽度文件可以与SQL * Loader或外部表并行加载。所以按照内容分开你的文件 - 不要试图去思考Oracle。 – 2010-06-08 08:55:23

0

您可以在CSV文件上创建一个外部表格,并通过从外部表格选择到另一个表格中加载它们。无论如何,这种方法不确定会更快,因为在让sql * loader工作时尤其如此,特别是当您有更新标准时。