更新时间:2025-09-12 GMT+08:00
分享

ALTER TABLE SUBPARTITION

功能描述

修改二级分区表分区,包括增删分区、清空分区、切割/合并分区、移动分区表空间、交换分区、重命名分区、开启/关闭分区自动扩展功能,以及修改分区属性等。

注意事项

  • 添加分区的表空间不能是pg_global。
  • 添加分区的名称不能与该分区表已有一级分区和二级分区的名称相同。
  • 添加分区的分区键值要和分区表的分区键的类型一致。
  • 如果目标分区表中已有分区数达到了最大值1048575,则不能继续添加分区。
  • 当分区表只有一个一级分区或二级分区时,不能删除该分区。
  • 选择分区使用PARTITION FOR()或SUBPARTITION FOR(),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。
  • 在M-Compatibility模式下,SUBPARTITION只支持HASH/KEY分区,但不支持添加HASH/KEY分区。只有一种情况例外,二级分区表的二级分区方式为HASH且一级分区方式不是HASH,此时支持新增一级分区并创建对应的二级分区;不支持删除HASH/KEY分区;不支持切割和合并HASH/KEY分区。
  • 只有分区表的所有者或者被授予了分区表ALTER权限的用户有权限执行ALTER TABLE PARTITION命令,系统管理员默认拥有此权限。
  • 删除、切割、清空、交换分区的操作会使Global索引失效,可以申明UPDATE GLOBAL INDEX子句同步更新索引。
  • 如果删除、切割、清空、交换分区操作不申明UPDATE GLOBAL INDEX子句,并发的DML业务有可能因为索引不可用而报错。
  • 若设置参数enable_gpi_auto_update为on,即使不申明UPDATE GLOBAL INDEX子句,也会自动更新Global索引。
  • 开启一级/二级列表分区自动扩展要求对应层级的分区中不能存在分区键值为DEFAULT的分区。

语法格式

修改二级分区表分区包括修改表分区主语法、修改表分区名称的语法、重置分区ID和开启/关闭分区自动扩展功能的语法。

  • 修改表分区主语法。
    ALTER TABLE { table_name  [*] | ONLY table_name | ONLY ( table_name  )}
        action [, ... ];
    其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何,M-Compatibility会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。
        move_clause  |
        exchange_clause  |
        truncate_clause  |
        set_partitioning_clause
    • move_clause子语法用于移动分区到新的表空间。
      MOVE SUBPARTITION { subpartition_name | FOR ( subpartition_value [, ...] ) } TABLESPACE tablespacename
    • exchange_clause子语法用于把普通表的数据迁移到指定的分区。
      EXCHANGE SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) } 
          WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} 
          [ { WITH | WITHOUT } VALIDATION ] [ UPDATE GLOBAL INDEX ]

      进行交换的普通表和分区必须满足如下条件:

      • 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。
      • 普通表和分区的表压缩信息严格一致。
      • 普通表索引和分区Local索引个数相同,且对应索引的信息严格一致。
      • 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。
      • 普通表不可以是临时表,分区表只能是二级分区表。
      • 完成交换后,普通表和分区的数据被置换,同时普通表和分区的表空间信息被置换。此时,普通表和分区的统计信息变得不可靠,需要对普通表和分区重新执行analyze。
      • 由于非分区键不能建立本地唯一索引,只能建立全局唯一索引,所以如果普通表含有唯一索引时,可能会导致不能交换数据。

        如果需要进行数交换数据操作可以通过创建中间表的方式,先将分区数据插入到中间表,truncate分区,普通表数据插入分区表,drop普通表,重命名中间表的方式完成数据交换操作。

      • 如果在普通表/分区表上进行了drop column操作,被删除的列依然物理存在,所以需要保证普通表和分区的被删除列也严格对齐才能交换成功。
    • truncate_clause子语法用于清空分区表中的指定分区。语法可以作用在一级分区上。
      TRUNCATE PARTITION  { { ALL | partition_name [, ...] } | FOR (  partition_value [, ...] )  } [ UPDATE GLOBAL INDEX ]

      也可以作用在二级分区上。

      TRUNCATE SUBPARTITION  { subpartition_name | FOR (  subpartition_value [, ...] )  } [ UPDATE GLOBAL INDEX ]
  • 修改表分区名称的语法。可以修改分区表的一级分区。
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name  )}
        RENAME PARTITION { partition_name | FOR ( partition_value [, ...] ) } TO partition_new_name;
    也可以修改分区表的二级分区。
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name  )}
        RENAME SUBPARTITION { subpartition_name | FOR ( subpartition_value [, ...] ) } TO subpartition_new_name;

参数说明

  • table_name

    分区表名。

    取值范围:已存在的分区表名。

  • subpartition_name

    二级分区名。

    取值范围:已存在的二级分区名。

  • tablespacename

    指定分区要移动到哪一个表空间。

    取值范围:已存在的表空间名。

    注:需要在非M-Compatibility数据库中创建或删除tablespace。

  • { ALL | partition_name [, ...] }

    ALL:清除所有分区数据。

    partition_name :目标分区表的分区名,支持一级分区名和二级分区名。

    取值范围:已存在的分区名。

  • partition_value

    一级分区键值。

    通过PARTITION FOR ( partition_value [, ...] )子句指定的这一组值,可以唯一确定一个一级分区。

    取值范围:需要进行操作的一级分区的分区键的取值范围。

  • subpartition_value

    一级分区键值和二级分区键值。

    通过SUBPARTITION FOR ( subpartition_value [, ...] )子句指定的这一组值,可以唯一确定一个二级分区。

    取值范围:对于需要进行操作的二级分区,需要同时有其一级分区分区键和二级分区分区键的取值范围。

  • UNUSABLE LOCAL INDEXES

    设置该分区上的所有索引不可用。

  • REBUILD UNUSABLE LOCAL INDEXES

    重建该分区上的所有索引。

  • { ENABLE | DISABLE } ROW MOVEMET

    行迁移开关。

    如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。

    取值范围:

    • ENABLE:打开行迁移开关。
    • DISABLE:关闭行迁移开关。

    默认是打开状态。

  • ordinary_table_name

    进行迁移的普通表的名称。

    取值范围:已存在的普通表名。

  • { WITH | WITHOUT } VALIDATION

    在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。

    取值范围:

    • WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。
    • WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。

    默认是WITH状态。

    由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。

  • partition_new_name

    分区的新名称。

    取值范围:字符串,要符合标识符说明

  • subpartition_new_name

    二级分区的新名称。

    取值范围:字符串,要符合标识符说明

  • UPDATE GLOBAL INDEX

    如果使用该参数,则会更新分区表上的所有全局索引,以确保使用全局索引可以查询出正确的数据;如果不使用该参数,则分区表上的所有全局索引将会失效。

示例

请参考CREATE TABLE SUBPARTITION的示例。

相关文档