在分区表上并发创建索引

evrscar2  于 2022-10-15  发布在  PostgreSQL
关注(0)|答案(2)|浏览(282)

我使用的是PostgreSQL14.1,并对一些表使用paritions重新创建了我的实时数据库。
因为我这样做了,所以我可以在服务器不活动时创建索引,但当它活动时,我只能使用concurrently创建,但不幸的是,当我尝试并发创建索引时,我得到了一个错误。
运行以下命令:

create index concurrently foo  on foo_table(col1,col2,col3));

提供错误:

ERROR:  cannot create index on partitioned table "foo_table" concurrently

现在它是一台实时服务器,我不能非并发地创建索引,为了提高性能,我需要创建一些索引。你有什么办法吗?
谢谢

gmxoilav

gmxoilav1#

没问题。首先,使用CREATE INDEX CONCURRENTLY在每个分区上创建索引。然后使用CREATE INDEX在分区表上创建索引。这会很快,分区上的索引将成为索引的分区。

6jygbczu

6jygbczu2#

步骤1:在分区(父)表上创建索引

CREATE INDEX foo_idx ON ONLY foo (col1, col2, col3);

此步骤创建的索引无效。这样,任何表分区都不会自动应用索引。
步骤2:使用CONCURRENTLY为每个分区创建索引并附加到父索引

CREATE INDEX CONCURRENTLY foo_idx_1
  ON foo_1 (col1, col2, col3);
ALTER INDEX foo_idx
  ATTACH PARTITION foo_idx_1;

对每个分区索引重复此步骤。
步骤3:验证在开头(步骤1)创建的父索引是否有效。将所有分区的索引附加到父索引后,父索引将自动标记为有效。

SELECT * FROM pg_index WHERE pg_index.indisvalid = false;

查询应返回零个结果。如果不是这样,那么检查您的脚本是否有错误。

相关问题