【问题标题】:Postgres Create Index command hangsPostgres 创建索引命令挂起
【发布时间】:2020-06-23 11:39:57
【问题描述】:

这类似于我最近发布的一个问题,即 COPY 命令因大型数据集而挂起。在那种情况下,这是由于外键约束。但在这种情况下,我正在创建一个索引,所以我认为 FK 不会成为问题,即使我仍然禁用了表上的触发器以防万一。我正在尝试在具有 100 亿行的表上添加常规 btree index。该索引位于两个int 字段上。我尝试运行它,它一直在运行,所以我认为它可能太慢了,我将max_parallel_maintenance_workers 增加到 8 和 maintenance_work_mem 到 2047MB(我在 Windows 上,所以它是最大值)。

那时,事情似乎进展得更快,但同样的问题发生了:我可以看到文件在 pgsql_tmp/pgsql_tmpxxxx.x.sharedfileset 文件夹中增长,直到它们停止但索引创建似乎从未完成。

我想知道我是否出于某种原因设置了太多工人,所以我尝试将其设置为 4,同样的问题。文件最后一次修改是在凌晨 3:20 左右,现在是早上 7:35,它仍在运行。文件夹中的文件为 261GB,与表大小相比看起来差不多,每次我运行进程时它都会停在那个大小,所以我假设它已经完成了创建索引,我只是不知道它可能在做什么在此刻。万一重要,该表在另一个具有 10 亿条记录的表上有一个外键,但该表上的触发器被禁用,这对我在表中加载数据很有用。我检查了锁,没有,它没有等待任何锁,这是有道理的,因为这是一个测试数据库,其中包含我为测试某些东西而创建的虚拟数据,所以其他人甚至都不知道它存在或有任何用途。

【问题讨论】:

  • 100 亿行已经很多了。这可能只需要很长时间,尤其是如果您不在 SSD 上。您的资源使用情况如何?是否使用 CPU 和磁盘?
  • 我得到了我需要的答案,但我想我会回复只是为了提供有关该过程的更多信息。 CPU 使用率非常低,即使我尝试使用 8 个工作进程也是如此。它是在一台退役的服务器上运行的,所以不是开发机器,所以资源非常好。话虽如此,不确定它使用的是哪种磁盘。最后,妈妈的时间完成了这项工作。

标签: postgresql indexing


【解决方案1】:

创建索引分几个阶段运行。必须读取表,必须对值进行排序,并且必须在磁盘上创建索引。

在某些阶段,您会看到临时文件在增长,而在其他阶段则不会,即使 CREATE INDEX 仍在工作。可能现在正在写索引文件。

所以请耐心等待,它会完成的。

如果您感到紧张,请查看 pg_locks 以查看 CREATE INDEX 是否被某些东西阻止。如果是CREATE INDEX CONCURRENTLY,可能就是这种情况,它确实做了更复杂的处理。

【讨论】:

  • 如果我必须总结这个答案,那就是“别抱怨了,坐下,等待!”这就是我所做的,它创造了奇迹,17 小时后索引终于创建了!我想这确实需要那么长时间。只是希望有更好的方法来跟踪进度。但是谢谢你的回答,你让希望活着!
  • 我希望我没有那么粗鲁,我很高兴它最终奏效了。说点正面的话:最近的 PostgreSQL 版本支持并行处理创建索引,这加快了进度。
  • 你肯定不粗鲁。我的评论可能无意中传达了我的看法,而事实上我只是想强调有时,答案就是耐心等待。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多