分区表是指拥有分区空间的表,即将表数据按照某个列或多个列进行划分,从而使表中的数据分散存储在不同的物理位置上。合理设计和使用分区,可以提高查询性能、简化数据管理,同时支持更灵活的数据访问与操作。
分区表类型
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)示例。
普通分区表示例
创建分区表。
-- 创建一个普通二级分区表,以日期为一级分区,地域为二级分区 CREATE TABLE src (shop_name STRING, customer_id BIGINT) PARTITIONED BY (pt STRING,region STRING);
添加分区,并执行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);
使用分区列作为过滤条件查询数据。
正确示例: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并不能保证分区过滤机制的有效性。pt是STRING类型,当STRING类型与BIGINT(20170506)进行比较时,MaxCompute会将二者转换为DOUBLE类型,此时可能会有精度损失。
SELECT * FROM src WHERE pt = 20170506 AND region = hangzhou;
自动分区表(AUTO PARTITION)示例
有关自动分区表的示例介绍,请参见以下文档: