文档

普通表转换为分区表

更新时间:

当单张普通表的数据量超过1亿或者1 TB时,建议使用分区表。本文介绍了使用ALTER语法将单张普通表转换为分区表的注意事项以及示例。

前提条件

普通表中的主键和唯一键都需要包含分区表中的分区键字段。

注意事项

  • 普通表转换为分区表的过程中,所有的数据都需要重新进行读写,属于COPY DDL操作。因此,转换时间比较长,且整个转换过程会阻塞当前表上的所有DML操作。

  • 特殊场景下的普通表转换为分区表,如果按照时间做RANGE分区,并且需要将所有数据放在一个历史分区中,可以将普通表快速转换为RANGE分区表

语法

ALTER TABLE table_name
PARTITION BY RANGE {(expr) | COLUMNS(column_list)}
(partition_definition [, partition_definition] ...);

其中,partition_definition的定义与各个类型的分区表中的partition_definition保持一致,支持二级分区。PolarDB支持的分区表类型请参见概述

说明

如需了解更多关于普通表转换为分区表的内容,请搜索钉钉群号加群进行咨询。钉钉群号:24490017825。

支持转换的分区表类型

目前所有的分区表都支持将普通表转换为分区表的操作。分区表类型请参见概述INTERVAL RANGE简介

示例

以普通表t1为例,介绍将普通表转换为分区表的操作。

  1. 创建普通表t1

    CREATE TABLE t1 (
    `a` int ,
    `b` int ,
    Primary Key(a, b));
  2. 执行以下命令,向表t1中插入数据。

    INSERT INTO t1 VALUES(1,1),(2,1),(3,1),(4,1),(111,111),(3333,333);
  3. 将表t1转换为分区表。

    • 将表t1转换为LIST DEFAULT HASH分区表。

      ALTER TABLE t1 partition BY LIST(a)
      (PARTITION p0 VALUES IN (1,2,3,4,5),
       PARTITION p1 VALUES IN (6,7,8,9,10),
       PARTITION pd DEFAULT PARTITIONS 9);
    • 将表t1转换为HASH分区表。

      ALTER TABLE t1 partition BY HASH(a) PARTITIONS 12;
    • 将表t1转换为RANGE分区表。

      ALTER TABLE t1 partition by RANGE(a) (
        PARTITION p0 VALUES LESS THAN (100),
        PARTITION p1 VALUES LESS THAN (200)
      );