具体来说,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
。
1条答案
按热度按时间pgky5nke1#
这个操作将总是获得一个
ACCESS EXCLUSIVE
锁。文档只告诉你如何减少锁被持有的时间。