表达到一定大小后,插入到 postgres 数据库会停止(挂起)且不会出现错误

jki*_*kim 5 postgresql insert postgresql-9.4 bulk-insert

我们目前正在尝试将大量数据(大约 2700 万条记录、200 列)插入到 postgres 9.4 数据库的单个表中。(是的,最好将表重构为较小的表,但首先尝试此方法)

插入由 libpq 应用程序管理,该应用程序使用“INSERT INTO ...”一次插入大约 300 行数据。我们已经阅读过有关使用 COPY 命令的信息,但就我们当前的使用情况而言,前者是更好的选择,具有不错的性能。有些列是数组,可能相当大,但使用此设置,我们可以毫无问题地插入大约 1000 万行数据。

问题:每当表达到大约 600GB(约 2000 万行)时,插入就会停止。pg_stat_activity 显示插入查询处于活动状态,并且输出和日志中都没有错误。对于通常需要几秒钟的插入查询,我们已经等待了超过 12 个小时。

我们尝试了一些方法,例如删除唯一索引(主键)、运行 ANALYZE 以及重新启动插入,但每当表达到 600GB 左右时,插入就会停止。我们不相信我们会遇到任何接近表格最大尺寸的情况,因此不确定发生了什么。

有人有什么主意吗?或者对如何找出插入过程中出现的问题有一些建议?

谢谢!

更新#1:如上所述,插入的行有 200 列宽,其中一些字段是数组。

当对表的插入停止时,我们尝试手动插入记录:

正如我们之前所见,典型的行不会被插入,查询也会挂起。当我们减少填充列的数量(例如,插入仅包含 200 个值中的 30 个值的记录)时,插入会成功,没有延迟/减慢。通过改变查询中填充列的数量,我们发现了一个截止点,如果插入的列数大于一定数量,则插入将挂起。(我们也尝试了不同的列组合,但没有任何效果)

我们不知道如何直接解决这个问题,因此我们目前正在按照建议将数据分区到不同的(较小的)表中。然而,任何文档中都没有提到这个问题,所以任何建议仍然将不胜感激!