更新时间:2026-07-23 GMT+08:00
分享

普通表转换为分区表

操作场景

当单张普通表的数据量超过10亿行或1 TB时,建议采用分区表。本章节将介绍如何使用ALTER语法将单张普通表转换为分区表,所有分区表类型均支持普通表转换分区表操作。

前提条件

在将普通表转换为分区表时,若普通表存在主键(Primary Key)和唯一键(Unique Key),则主键和唯一键均需包含分区键(Partition Key)字段。以确保每个分区内数据及全局数据的唯一性。

注意事项

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

语法

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

其中,partition_definition的定义与各个类型的分区表中的partition_definition保持一致,支持二级分区。

示例

此处以普通表sales为例,为您演示如何将普通表转换为分区表。

  1. 创建普通表并插入数据
    CREATE TABLE sales (
        id INT NOT NULL,
        sale_date DATE NOT NULL,
        region VARCHAR(10) NOT NULL,
        amount DECIMAL(10,2),
        PRIMARY KEY (id, sale_date, region)
    );
    
    INSERT INTO sales (id, sale_date, region, amount) VALUES
    (1, '2023-01-15', 'east',  100.00),
    (2, '2023-02-20', 'west',  150.00),
    (3, '2023-03-10', 'north', 200.00),
    (4, '2023-04-05', 'south', 250.00),
    (5, '2023-05-12', 'east',  300.00),
    (6, '2023-06-18', 'west',  350.00);
  2. 将普通表转换为分区表。
    • 转换为LIST分区表。
      ALTER TABLE sales
      PARTITION BY LIST COLUMNS(region) (
          PARTITION p_east  VALUES IN ('east'),
          PARTITION p_west  VALUES IN ('west'),
          PARTITION p_north VALUES IN ('north'),
          PARTITION p_south VALUES IN ('south')
      );
    • 转换为HASH分区表。
      ALTER TABLE sales
        PARTITION BY HASH(id)
        PARTITIONS 4;
    • 转换为RANGE分区表。
      ALTER TABLE sales
      PARTITION BY RANGE (YEAR(sale_date)) (
          PARTITION p2022 VALUES LESS THAN (2023),
          PARTITION p2023 VALUES LESS THAN (2024),
          PARTITION p2024 VALUES LESS THAN (2025),
          PARTITION p_future VALUES LESS THAN MAXVALUE
      );

相关文档