如何在大型事务下获得高性能(postgresql)

时间:2012-07-04 03:22:44

标签: postgresql transactions

我有数据需要2百万插入postgresql。但它的表现却很低。我可以通过将大型事务拆分为较小的事务来实现高性能插入器(实际上,我不想这样做)?或者,还有其他明智的解决方案吗?

3 个答案:

答案 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)

提高绩效的可能方法:

  1. 使用COPY命令。
  2. 如果您的数据可以处理后果,请尝试减少交易的isolation level
  3. 调整PostgreSQL服务器配置。默认内存限制非常低,即使服务器具有千兆字节的可用内存,也会导致磁盘丢失。
  4. 关闭PostgreSQL服务器上的磁盘障碍(例如nobarrier文件系统的ext4标志)和/或fsync警告:这通常是不安全的,但会大大提高您的表现。
  5. 在插入数据之前删除表中的所有索引。某些索引需要做很多工作才能在添加行时保持最新。 PostgreSQL最终可能能够更快地创建索引,而不是通过插入过程不断更新并行中的索引。不幸的是,没有简单的方法可以“保存”当前索引,然后再次恢复/创建相同的索引。
  6. 将插入作业拆分为一系列较小的事务只有在因为与paraller事务的数据依赖性问题而必须重试事务时才有帮助。如果事务在第一次尝试时成功,则将其拆分为按顺序运行的几个较小的事务只会降低您的性能。

答案 2 :(得分:0)

以我的经验,您可以通过将大型事务拆分为较小的事务来缩短INSERT的完成时间,但前提是要插入的表没有应用索引或约束,并且没有必须竞争的默认字段值多个并发事务下的共享资源。在这种情况下,将插入物分成几个不同的部分,然后将每个部分作为单独的流程同时提交,将大大减少工作时间。