附加/分离分区

PolarDB PostgreSQL版附加/分离分区的语法完全兼容PostgreSQL。本文详细介绍了其语法及示例。

概述

  • 附加(Attach)分区: 将一个普通表附加到分区表中,成为分区表的一个分区。

  • 分离(Detach)分区: 将一个分区表的分区分离出来,成为一个普通表。它避免了将分区表中的数据直接删除,而是将其分离出来作为一个普通表移至别处。

语法说明

说明

PolarDB PostgreSQL版完全兼容PostgreSQL。关于附加/分离分区的详细语法说明,请参考PostgreSQL文档

附加分区

ALTER TABLE [ IF EXISTS ] name
    ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }

上述语法即表示附加一个现有表(该表本身可能已分区)作为目标表的分区。 您可以使用 FOR VALUES 将表附加为特定值的分区,或者使用 DEFAULT 将表附加为默认分区。

在这个附加的过程中,对于目标表中的每个索引,都会在附加的表中创建一个对应的索引。如果对应索引已存在,则将附加到目标表的索引,如同执行 ALTER INDEX ATTACH PARTITION 一样。

说明

如果现有表是外部表,并且目标表上有 UNIQUE 索引,则当前不允许将该表附加为目标表的分区。

分离分区

ALTER TABLE [ IF EXISTS ] name
    DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]

上述语法即表示将目标分区表中的指定分区分离出来。分离的分区继续作为独立表存在,但不再与其分离的表有任何联系。 经过分离,目标分区表和分离出来的独立表具有如下变化:

  • 附加到目标表索引的任何索引都将被分离出来。

  • 任何作为目标表中触发器的克隆而创建的触发器都将被删除。

  • 在外键约束中引用此分区的任何表上都会获得共享锁。例如:假设分区表A引用了分区B作为外键,若从分区表B中分离一个分区B_p1,则会对分区表A加上共享锁。

上述语法中还可以指定CONCURRENTLYFINALIZE

  • 如果指定CONCURRENTLY,则会在低级别锁定上运行,以避免阻塞可能正在访问分区表的其他会话。

    在这种模式下,内部使用两个事务:

    • 在第一个事务期间,对父表和分区都采用SHARE UPDATE EXCLUSIVE锁,并将分区标记为正在进行分离; 此时,事务已提交,并且使用分区表的所有其他事务都将等待。

    • 所有这些事务完成后,第二个事务将获取分区表上的SHARE UPDATE EXCLUSIVE和分区上的ACCESS EXCLUSIVE,并且分离过程完成。 与分区约束重复的CHECK约束将添加到分区中。

    说明

    CONCURRENTLY不能在事务块中运行,并且如果分区表包含默认分区,则不允许使用CONCURRENTLY。

  • 如果指定了FINALIZE,则等待先前取消或中断的DETACH CONCURRENTLY调用将完成。

示例

附加分区

将cities_partdef附加到cities分区表中作为默认分区:

ALTER TABLE cities
    ATTACH PARTITION cities_partdef DEFAULT;

分离分区

将分区measurement_y2015m12从measurement分区表中分离出来,作为一个独立的表。

ALTER TABLE measurement
    DETACH PARTITION measurement_y2015m12;