我想知道是否有人对我即将开始的工作有任何经验。我有几个 csv 文件,大小都在 GB 左右,我需要将它们加载到一个 oracle 数据库中。虽然加载后我的大部分工作都是只读的,但我需要不时加载更新。基本上我只需要一个很好的工具来一次加载几行数据到我的数据库。
这是我到目前为止发现的:
我可以使用 SQL Loader 完成很多工作
我可以使用批量插入命令
某种批量插入。
以某种方式使用准备好的语句可能是一个好主意。我想我想知道每个人都认为完成此插入的最快方法是什么。有小费吗?
我想知道是否有人对我即将开始的工作有任何经验。我有几个 csv 文件,大小都在 GB 左右,我需要将它们加载到一个 oracle 数据库中。虽然加载后我的大部分工作都是只读的,但我需要不时加载更新。基本上我只需要一个很好的工具来一次加载几行数据到我的数据库。
这是我到目前为止发现的:
我可以使用 SQL Loader 完成很多工作
我可以使用批量插入命令
某种批量插入。
以某种方式使用准备好的语句可能是一个好主意。我想我想知道每个人都认为完成此插入的最快方法是什么。有小费吗?
如果您可以推出自己的实用程序,它的性能将优于SQL*Loader Direct Path Loads ,我会感到非常惊讶。Oracle 正是为了这个目的而构建了这个实用程序——构建更高效的东西的可能性几乎为零。还有Parallel Direct Path Load,它允许您同时运行多个直接路径加载进程。
从手册:
直接路径加载不是使用 SQL INSERT 语句填充绑定数组缓冲区并将其传递给 Oracle 数据库,而是使用直接路径 API 将要加载的数据传递给服务器中的加载引擎。加载引擎根据传递给它的数据构建一个列数组结构。
直接路径加载引擎使用列数组结构来格式化 Oracle 数据块并构建索引键。新格式化的数据库块直接写入数据库(如果主机平台支持异步 I/O,则每个 I/O 请求使用异步写入多个块)。
在内部,多个缓冲区用于格式化块。在填充一个缓冲区时,如果主机平台上有可用的异步 I/O,则正在写入一个或多个缓冲区。使用 I/O 重叠计算可提高负载性能。
有些情况下不能使用直接路径加载。
有了这么多数据,您最好确定您的后备存储——dbf 磁盘的可用空间。
sqlldr是脚本驱动,效率很高,一般比sql脚本效率高。我唯一想知道的是数据的大小。我个人会考虑几个到多个 sqlldr 进程,并为每个进程分配一个数据子集,并让这些进程并行运行。
你说你想一次加载几条记录?这可能需要比你想象的更长的时间。你的意思是一次几个文件?
您可以在 CSV 文件上创建一个外部表,并通过从外部表中选择将它们加载到另一个表中。不确定此方法是否会更快,但是在弄乱 sql*loader 工作方面可能会更快,尤其是当您有 UPDATE 标准时。