【发布时间】:2025-12-09 16:50:01
【问题描述】:
我有一个 Java 程序,用于在 Oracle 数据库中插入大量 (750.000) 条记录。我正在使用 OJDBC6 库和 OCI 客户端。要写入的表包含 330 列,其中 8 列出现在一个或多个索引中。
在尝试了两种方法后,我仍然在为一些性能问题苦苦挣扎。
- 创建一次准备好的语句,为每条记录填充参数,然后执行该语句需要 1 小时 29 分钟。
- 一次创建一个准备好的语句,为每条记录填充参数,将它们添加到一个批处理中,然后每 500/1000/5000 次执行批处理(我尝试了几个选项)处理的记录需要 0h27。
但是,当使用 Informatica PowerCenter 等 ETL 工具将相同的数据映射到相同的表时,只需几分钟。我知道达到这个时间可能是一厢情愿,但我怀疑是否无法获得任何性能。
是否有人知道此操作的合理时间安排以及如何实现?任何帮助表示赞赏,非常感谢提前!
(一个相关问题:我也必须更新很多记录。最有效的方法是什么:要么跟踪已更改的列,要么创建一个仅包含这些列的依赖于记录的预准备语句;还是总是更新所有列,从而重用相同的预处理语句?)
【问题讨论】:
-
您可以在 unindex 临时表中插入数据,您可以使用 select 插入该临时表中。如果一次只有一个写入器,则可以使用多个线程并使用普通表作为暂存区。如果您不需要在单个事务中提交所有内容,您还可以直接对目标表进行并行批量插入试验
-
顺便说一句,拥有 330 列的表通常不是一个好主意
-
是auto-commit on?不知道这在幕后是如何工作的,但我可以想象它会减慢速度。
-
这些字段中是否包含大数据(blob、clob)?这可能会导致问题。过去我使用批处理 api 每分钟插入 10K 条记录。不是每列 330 列,而是 80/90 列。
-
非常感谢您的反馈。 @SamiKorhonen:表格的布局由外部工具的供应商暗示。不幸的是,我们对此无能为力。我会考虑并行提示。
标签: java performance oracle ojdbc