我正在编写一个对Postgres数据库进行大量写操作的程序.在一个典型的场景中,我会写出100,000行表示规范化(三个外部整数键,其组合是主键和表的索引).我正在使用PreparedStatements和executeBatch(),但我只能设法在我的笔记本电脑上大约70秒内推出100k行,当我们要替换的嵌入式数据库(具有相同的外键约束和索引)时10.
我是JDBC的新手,我不希望它超过自定义嵌入式数据库,但我希望它只慢2-3倍,而不是7倍.有什么明显的我可能会错过吗?写作的顺序是否重要?(即如果它不是索引的顺序?).需要注意的是要挤出更快的速度?
这是我在当前项目中不得不经常处理的问题.对于我们的应用,插入速度是一个关键的瓶颈.但是,我们已经发现绝大多数数据库用户将选择速度作为他们的主要瓶颈,因此您会发现有更多资源来处理该问题.
以下是我们提出的一些解决方案:
首先,所有解决方案都涉及使用postgres COPY命令.使用COPY将数据导入postgres是迄今为止最快的方法.但是,默认情况下,JDBC驱动程序当前不支持网络套接字上的COPY.因此,如果您想使用它,您需要执行以下两种解决方法之一:
JDBC驱动程序打补丁来支持COPY,比如这一个.
如果要插入的数据和数据库位于同一物理计算机上,则可以将数据写入文件系统上的文件,然后使用COPY命令批量导入数据.
增加速度的其他选项是使用JNI命中postgres api,这样你就可以通过unix套接字进行通信,删除索引和pg_bulkload项目.但是,最后如果你没有实施COPY,你总会发现性能令人失望.