簡體   English   中英

Postgres - 如何在不持有 AccessExclusiveLock 的情況下向具有 DEFAULT 分區的表添加分區?

[英]Postgres - how to add a partition to a table that has a DEFAULT partition, without holding AccessExclusiveLock?

具體來說, postgres doc文檔的這一部分說我應該能夠避免掃描默認分區:

在運行 ATTACH PARTITION 命令之前,建議在要附加的表上創建一個 CHECK 約束,該約束與預期的分區約束相匹配,如上所示。 這樣,系統將能夠跳過驗證隱式分區約束所需的掃描。 如果沒有 CHECK 約束,將掃描表以驗證分區約束,同時對該分區持有 ACCESS EXCLUSIVE 鎖。 建議在 ATTACH PARTITION 完成后刪除現在冗余的 CHECK 約束。 如果被附加的表本身是一個分區表,那么它的每個子分區都將被遞歸鎖定和掃描,直到遇到合適的 CHECK 約束或到達葉分區。

同樣,如果分區表有一個DEFAULT分區,建議創建一個排除待附加分區約束的CHECK約束。 如果不這樣做,則將掃描 DEFAULT 分區以驗證它不包含應位於所附加分區中的記錄。 此操作將在 DEFAULT 分區上持有 ACCESS EXCLUSIVE 鎖的同時執行。 如果 DEFAULT 分區本身是一個分區表,那么它的每個分區將以與附加表相同的方式遞歸檢查,如上所述。

但是,以下內容對我不起作用: task_time not null並且類型為timestamp (6) with timezone

-- create new empty partition table
CREATE TABLE tasks_partitions.tasks_20230111
(LIKE tasks INCLUDING DEFAULTS INCLUDING CONSTRAINTS);

-- add CHECK constraint on new partition 
ALTER TABLE tasks_partitions.tasks_20230111 ADD CONSTRAINT tmp_20230111
CHECK (task_time >= '2023-01-11 00:00:00+00' AND task_time <= '2023-01-11 23:59:59.999999+00');

-- add CHECK constraint on default partition that excludes new partition constraint
ALTER TABLE tasks_partitions.tasks_20230111 ADD CONSTRAINT tmp20230111_default
CHECK (task_time < '2023-01-11 00:00:00+00' and task time > '2023-01-11 23:59:59.999999+00') NOT VALID;

-- attach partition
ALTER TABLE tasks ATTACH PARTITION tasks_partitions_tasks_20230111
FOR VALUES FROM ('2023-01-11 00:00:00+00') TO ('2023-01-11 23:59:59.999999+00')

附加分區仍然持有AccessExclusiveLock

此操作將始終采用ACCESS EXCLUSIVE鎖。 該文檔僅告訴您如何減少持有鎖的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM