如何调整Oracle的SQL * Loader追加?

时间:2014-11-03 18:30:05

标签: oracle sql-loader

我正在编写一个Java程序,它创建一个包含符合特定分发参数的6,800,000条记录的CSV文件,并使用Oracle的SQL * Loader填充表。

我正在使用不同大小的记录(50,000和500.000)测试我的程序。 CSV文件生成本身非常快,使用并发创建并将这些记录插入文件需要几毫秒。

另一方面,插入所述记录花费的时间太长。读取SQL * Loader生成的日志文件,需要00:00:32.90秒填充表中50,000条记录,00:07:58.83分钟填充500,000条。

SQL * Loader基准测试我用Google搜索显示了更好的性能,例如在不到2分钟内就有200万行。我跟着this tutorial来改善时间,但几乎没有改变。这里显然有问题,但我不知道是什么。

这是我的控制文件:

OPTIONS (SILENT=ALL, DIRECT=TRUE, ERRORS=50, COLUMNARRAYROWS=50000, STREAMSIZE=500000)
UNRECOVERABLE LOAD DATA
APPEND
INTO TABLE MY_TABLE
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
...

另一个重要信息:我尝试过使用PARALLEL = TRUE,但是我收到了ORA-26002错误(表MY_TABLE已经定义了索引)。不幸的是,使用skip_index_maintenance运行会使索引无法使用。

我做错了什么?


更新

我注意到在运行程序后不久(不到一秒钟),所有行都已存在于数据库中。然而,SQL * Loader仍然很忙,只能在32-45秒后完成。

它能做什么?

1 个答案:

答案 0 :(得分:1)

一种想法是创建外部表并将名称设置为csv文件。然后在创建文件后,您可以在Oracle中运行sql脚本来直接处理数据。

或者,请查看以下内容(从here复制:)

当并行使用批量加载选项来加载具有索引的Oracle目标时,会导致此问题。 Oracle限制。

要解决此问题,请执行以下操作之一:

·将目标载荷选项更改为“正常”。

·在关系连接浏览器中禁用启用并行模式选项。

·在加载前删除索引。

·或者创建一个会前和会话后的sql来删除并创建索引和键约束