4

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

4

3 回答 3

5

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

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

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

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

于 2012-07-04T07:52:06.590 回答
5

提高性能的可能方法:

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

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

于 2013-11-18T06:24:32.837 回答
1

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

于 2018-09-18T13:01:57.973 回答