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

Mr *_*ain 3 postgresql transactions

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

Szy*_*ski 5

不,让它更快的主要思想是在一个事务中完成所有插入。多个事务,或不使用事务,要慢得多。

并尝试使用复制,它甚至更快:http : //www.postgresql.org/docs/9.1/static/sql-copy.html

如果您确实必须使用插入,您也可以尝试删除此表上的所有索引,并在加载数据后创建它们。

这也很有趣:http : //www.postgresql.org/docs/9.1/static/populate.html


Mik*_*nen 5

提高性能的可能方法:

  1. 使用COPY命令。
  2. isolation level如果您的数据可以处理后果,请尝试减少交易。
  3. 调整 PostgreSQL 服务器配置。默认内存限制非常低,即使服务器具有千兆字节的可用内存,也会导致磁盘垃圾。
  4. 关闭磁盘屏障(例如文件系统nobarrier的标志ext4)和/或fsyncPostgreSQL 服务器。警告:这通常是不安全的,但会大大提高你的性能。
  5. 在插入数据之前删除表中的所有索引。在添加行时,某些索引需要做大量工作才能保持最新。PostgreSQL 最终可能能够更快地创建索引,而不是与插入过程并行地不断更新索引。不幸的是,没有简单的方法来“保存”当前索引并在以后再次恢复/创建相同的索引。

仅当由于并行事务的数据依赖性问题而必须重试事务时,将插入作业拆分为一系列较小的事务才会有所帮助。如果事务在第一次尝试时成功,将其分成几个按顺序运行的较小事务只会降低性能。