我有 200 万条数据需要插入到 postgresql 中。但它发挥了低效。我可以通过将大事务拆分为较小的事务来实现高性能插入器(实际上,我不想这样做)?或者,还有其他明智的解决方案吗?
问问题
8603 次
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
提高性能的可能方法:
- 使用
COPY
命令。 isolation level
如果您的数据可以处理后果,请尝试减少交易。- 调整 PostgreSQL 服务器配置。默认内存限制非常低,即使服务器具有千兆字节的可用内存,也会导致磁盘损坏。
- 关闭磁盘屏障(例如文件系统
nobarrier
的标志ext4
)和/或fsync
在 PostgreSQL 服务器上。警告:这通常是不安全的,但会大大提高您的性能。 - 在插入数据之前删除表中的所有索引。在添加行时,一些索引需要大量工作才能保持最新。PostgreSQL 最终可能能够更快地创建索引,而不是与插入过程并行地不断更新索引。不幸的是,没有简单的方法可以“保存”当前索引,然后再次恢复/创建相同的索引。
仅当由于并行事务的数据依赖性问题而必须重试事务时,将插入作业拆分为一系列较小的事务才会有所帮助。如果事务在第一次尝试时成功,将其拆分为几个按顺序运行的较小事务只会降低您的性能。
于 2013-11-18T06:24:32.837 回答
1
根据我的经验,您可以通过将大型事务拆分为较小的事务来改进 INSERT 完成时间,但前提是您要插入的表没有应用索引或约束,并且没有必须争夺共享的默认字段值多个并发事务下的资源。在这种情况下,将插入拆分为几个不同的部分,并将每个部分作为单独的进程同时提交,将在更短的时间内完成工作。
于 2018-09-18T13:01:57.973 回答