Postgres 的 CREATE UNIQUE INDEX 似乎卡住了一段时间

Dan*_*iel 2 postgresql amazon-rds

我在 Postgres 中创建了一个索引,如下所示:

CREATE UNIQUE INDEX my_index_name 
       ON my_table USING btree (custid, 
                                date_trunc('day'::text, timezone('UTC'::text, somedate)),
                                firstname,
                                middlename,
                                lastname);
Run Code Online (Sandbox Code Playgroud)

我监视了可用磁盘空间,以估计索引创建的进度,我希望看到可用空间下降,表明该进程正在完成其工作。问题是,宕机40分钟后,卡住了25分钟,然后又开始消耗磁盘空间:

在此输入图像描述

当它似乎卡住时,我检查了长时间运行的进程,看看是否有什么东西阻塞了它(不太可能,这是一个没有其他人使用的数据库副本),我看到有 3 个不同的相同的“CREATE INDEX”进程。

这就是我想问的:

  • 为什么 Postgres 显示 3 个不同的进程?
  • 这段看似卡住的时期它在做什么?

这是我发出的命令来查看长时间运行的进程,在进程解除卡顿后,只有进程 18511 继续运行:

my_user => SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state
    FROM pg_stat_activity
    WHERE (now() - query_start) > interval '5 minutes' AND state != 'idle'
    ORDER by 2 DESC;

-[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------
pid      | 18511                                                                                                                                                          
duration | 01:04:37.969599                                                                                                                                                
query    | CREATE UNIQUE INDEX my_index_name ON my_table USING btree (custid, date_trunc('day'::text, timezone('UTC'::text, somedate)), firstname, middlename, lastname); 
state    | active                                                                                                                                                         
-[ RECORD 2 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------
pid      | 12712
duration | 01:04:37.969599
query    | CREATE UNIQUE INDEX my_index_name ON my_table USING btree (custid, date_trunc('day'::text, timezone('UTC'::text, somedate)), firstname, middlename, lastname);
state    | active
-[ RECORD 3 ]-------------------------------------------------------------------------------------------------------------------------------------------------------------
pid      | 12713
duration | 01:04:37.969599
query    | CREATE UNIQUE INDEX my_index_name ON my_table USING btree (custid, date_trunc('day'::text, timezone('UTC'::text, somedate)), firstname, middlename, lastname);
state    | active
Run Code Online (Sandbox Code Playgroud)

其他一些信息

  • 我在 Amazon 的 RDS 中运行 Postgres 11.5
  • 该表的大小为 255 GiB
  • 在该图中,Y 轴以 MiB 为单位,因此顶部有 800GiB

Lau*_*lbe 5

如果您看到更多进程创建索引,则说明您使用的是 PostgreSQL v11 或更高版本,并且有并行工作进程正在构建索引。这没什么好担心的;它会消耗更多资源,但构建索引速度更快。

建立索引有几个步骤:扫描表、对条目进行排序等。并非所有这些步骤都会消耗磁盘空间。例如,排序不应消耗越来越多的存储量。

简而言之,一切看起来都是如此。