我正在编写一个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秒后完成。
它能做什么?
答案 0 :(得分:1)
一种想法是创建外部表并将名称设置为csv文件。然后在创建文件后,您可以在Oracle中运行sql脚本来直接处理数据。
或者,请查看以下内容(从here复制:)
当并行使用批量加载选项来加载具有索引的Oracle目标时,会导致此问题。 Oracle限制。
要解决此问题,请执行以下操作之一:
·将目标载荷选项更改为“正常”。
·在关系连接浏览器中禁用启用并行模式选项。
·在加载前删除索引。
·或者创建一个会前和会话后的sql来删除并创建索引和键约束