分区表概述

分区表是指拥有分区空间的表,即将表数据按照某个列或多个列进行划分,从而使表中的数据分散存储在不同的物理位置上。合理设计和使用分区,可以提高查询性能、简化数据管理,同时支持更灵活的数据访问与操作。

分区表类型

MaxCompute支持普通分区表和自动分区表(AUTO PARTITION)两种分区表类型,您可根据不同使用场景所需的分区列生成方式,选择不同的分区表类型。

  • 普通分区表:直接指定一个或多个分区字段对表进行分区。

  • 自动分区表(AUTO PARTITION):分区列基于以下两种不同方式自动生成。

    自动分区方式

    功能介绍

    基于时间计算函数的自动分区表

    支持用户对表中的时间或日期类型(如DATE、DATETIME、TIMESTAMP、TIMESTAMP_NTZ)的数据列使用特定的时间计算函数(TRUNC_TIME),MaxCompute将自动根据数据列计算后的结果生成分区列的值,对表进行分区。

    基于数据写入时间的自动分区表

    系统会自动获取数据写入MaxCompute的时间,结合用户指定的时间计算函数(TRUNC_TIME),根据计算后的结果生成分区列的值,对表进行分区。这种基于数据写入时间的自动分区表又称为Ingestion Time Partition表。

使用场景

当您存在以下的使用场景和诉求时,可以考虑对表进行分区:

  • 提升查询性能:希望通过仅扫描表的部分数据提高查询效率,使用分区表能显著减少数据处理量。

  • 减少查询成本:MaxCompute支持分区裁剪能力,在查询前指定分区列的过滤条件,即可在查询运行时只读取部分表分区的数据,避免全表扫描引起的资源浪费。

  • 实现分区级别的数据管理:支持精准的数据写入和高效的数据删除能力,在无须全表扫描和不影响表中其他分区的情况下,将数据写入特定分区或单独删除指定分区;同时,可以结合表的生命周期设置,实现分区级别的自动数据清理。

说明

通常情况下,建议单分区的数据量不小于一万行。若每个分区下的数据量过小,创建过多的小分区将导致计算查询性能的下降。

使用限制

  • 支持的单表分区层级最多为6级。

  • 支持的单表分区数最大值为60000个。

  • 单次查询时,允许查询最多的分区个数为10000个。

  • STRING分区类型的分区值不支持使用中文。

分区列数据类型

  • MaxCompute 2.0数据类型版本下,分区字段支持STRING、TINYINT、SMALLINT、INT、BIGINT、VARCHAR类型。

    MaxCompute的分区值以STRING类型进行存储。对于非字符串类型的分区字段,其值会在内部被自动转换为字符串类型。为避免因数据类型转换导致的异常,建议在设计分区字段时使用STRING类型。

  • MaxCompute 1.0数据类型版本下,分区字段仅支持STRING类型。

    此时虽然也可以指定分区列的类型为BIGINT,但是除了表的字段显示为BIGINT类型,任何其他的计算场景中(例如,字段的计算和比较),该分区列都被当作STRING类型处理。执行如下语句后,返回结果为空。

    ---创建表parttest。
    CREATE TABLE parttest (a BIGINT) PARTITIONED BY (pt BIGINT);
    
    ---向表中插入数据。
    INSERT INTO parttest PARTITION(pt)(a,pt) VALUES (1, 1);
    INSERT INTO parttest PARTITION(pt)(a,pt) VALUES (1, 10);
    
    ---查询表中字段pt大于等于2的行。
    SELECT * FROM parttest WHERE pt >= '2';
  • MaxCompute当前不支持时间/日期类型的数据作为分区列,但可使用自动分区表(AUTO PARTITION)能力,基于表中的时间/日期类型的数据进行函数计算并生成分区,详情请参见自动分区表(AUTO PARTITION)示例

普通分区表示例

  1. 创建分区表。

    -- 创建一个普通二级分区表,以日期为一级分区,地域为二级分区
    CREATE TABLE src (shop_name STRING, customer_id BIGINT) PARTITIONED BY (pt STRING,region STRING);
  2. 添加分区,并执行INSERT INTO命令向分区表src中追加数据。

    ALTER TABLE src ADD PARTITION (pt='20170506',region='hangzhou') PARTITION (pt='20180101',region='shanghai');
    INSERT INTO src PARTITION (pt='20170506',region='hangzhou') VALUES ('s1',1),('s2',2),('s3',3);
    INSERT INTO src PARTITION (pt='20180101',region='shanghai') VALUES ('c1',4),('c2',5),('c3',6);
  3. 使用分区列作为过滤条件查询数据。

    • 正确示例:MaxCompute在生成查询计划时只会将一级分区pt='20170506'下的二级分区region='hangzhou'的数据纳入输入中。

      SELECT * FROM src WHERE pt='20170506' AND region='hangzhou'; 

      返回结果如下:

      +------------+-------------+------------+------------+
      | shop_name  | customer_id | pt         | region     |
      +------------+-------------+------------+------------+
      | s1         | 1           | 20170506   | hangzhou   |
      | s2         | 2           | 20170506   | hangzhou   |
      | s3         | 3           | 20170506   | hangzhou   |
      +------------+-------------+------------+------------+
    • 错误示例:在该方式下,MaxCompute并不能保证分区过滤机制的有效性。ptSTRING类型,当STRING类型与BIGINT(20170506)进行比较时,MaxCompute会将二者转换为DOUBLE类型,此时可能会有精度损失。

      SELECT * FROM src WHERE pt = 20170506 AND region = hangzhou; 

自动分区表(AUTO PARTITION)示例

有关自动分区表的示例介绍,请参见以下文档: