【发布时间】: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