我有数据需要2百万插入postgresql。但它的表现却很低。我可以通过将大型事务拆分为较小的事务来实现高性能插入器(实际上,我不想这样做)?或者,还有其他明智的解决方案吗?
答案 0 :(得分:4)
不,更快的主要想法是在一个事务中执行所有插入操作。多个事务或不使用事务的速度要慢得多。
尝试使用复制,速度更快:http://www.postgresql.org/docs/9.1/static/sql-copy.html
如果你真的必须使用插入,你也可以尝试删除这个表上的所有索引,并在加载数据后创建它们。
这也很有趣:http://www.postgresql.org/docs/9.1/static/populate.html
答案 1 :(得分:3)
提高绩效的可能方法:
COPY
命令。isolation level
。nobarrier
文件系统的ext4
标志)和/或fsync
。 警告:这通常是不安全的,但会大大提高您的表现。将插入作业拆分为一系列较小的事务只有在因为与paraller事务的数据依赖性问题而必须重试事务时才有帮助。如果事务在第一次尝试时成功,则将其拆分为按顺序运行的几个较小的事务只会降低您的性能。
答案 2 :(得分:0)
以我的经验,您可以通过将大型事务拆分为较小的事务来缩短INSERT的完成时间,但前提是要插入的表没有应用索引或约束,并且没有必须竞争的默认字段值多个并发事务下的共享资源。在这种情况下,将插入物分成几个不同的部分,然后将每个部分作为单独的流程同时提交,将大大减少工作时间。