添加主键到PostgreSQL 12分区表而不长锁

xv8emn3q  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(177)

我想在不长时间锁定分区表的情况下向分区表添加主键。
对于常规表,我可以创建一个索引CONCURRENTLY并将该索引提升为主键。对于分区表,每当我尝试这样做时,我都会得到错误:

Query 1 ERROR: ERROR:  ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables

我看到的唯一替代方案是不并发使用,而是直接通过列调用主键的创建:

ALTER TABLE table_name ADD PRIMARY KEY (col1, col2);

然而,在我做这个锁定操作之前,我想问问这里是否有人知道另一种方法。
[edit]下面是我尝试的SQL代码:

-- Create an invalid index
CREATE UNIQUE INDEX main_iex ON ONLY table_name (uuid, accessed);

-- Create index on each partition
CREATE UNIQUE INDEX CONCURRENTLY part1_idx ON part1 (uuid, accessed);
CREATE UNIQUE INDEX CONCURRENTLY part2_idx ON part2 (uuid, accessed);
...

-- Attach the partition indexes to the invalid one created before
ALTER INDEX main_idx ATTACH PARTITION part1_idx;
ALTER INDEX main_idx ATTACH PARTITION part2_idx;
...

-- At this point my main_idx should be valid

-- Make a primary key using the main index that should be valid after indexing each partition
ALTER TABLE request_log ADD PRIMARY KEY USING INDEX request_log_uuid_accessed_idx;

-- Result is:
-- Query 1 ERROR: ERROR:  ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables

[edit]这里是一个工作解决方案的SQL代码,在实现了@jjanes的建议之后。这个解决方案只有最短的分区表被锁定的时间:

-- For each partition:
CREATE UNIQUE INDEX CONCURRENTLY part1_idx ON part1 (uuid, accessed);
ALTER TABLE part1 ADD PRIMARY KEY USING INDEX part1_idx;

CREATE UNIQUE INDEX CONCURRENTLY part2_idx ON part2 (uuid, accessed);
ALTER TABLE part2 ADD PRIMARY KEY USING INDEX part2_idx;

...

-- After creating a primary key for each partition, creating a primary key for the partitioned table is very fast
ALTER TABLE table ADD PRIMARY KEY (uuid, accessed);
9gm1akwq

9gm1akwq1#

你应该让我们看看你到底做了什么,而不是让我们去猜测。
看起来像是在主表上创建了一个唯一索引,然后试图将其提升为主键。相反,在每个分区上单独创建一个主键,然后只在主表上创建主键,而不指定要使用的索引,只指定列。该创建将只将所有现有分区主键合并到新的总主键中。而不需要建立任何索引。

相关问题