全部产品
Search
文档中心

实时数仓Hologres:CREATE PARTITION TABLE

更新时间:Jun 20, 2025

CREATE PARTITION TABLE语句用于创建分区表(Partition Table)。本文为您介绍CREATE PARTITION TABLE的用法。

命令说明

说明

下文无特殊说明的父表和子表皆指分区的父表和子表。

父表按分区键(Partition Key)的值划分为不同的子表,子表对外可见,分区表在使用时,需要提前创建子表。您可以通过CREATE PARTITION TABLE命令创建分区表,使用动态分区管理功能自动创建分区子表。

分区表的不同分区子表采用不同的文件存储,查询时带上分区条件,指定所需查询的分区,避免全表扫描,快速定位存储文件,提高处理效率。通常将事实表按照日期划分为不同的分区。分区表的任何一个子表在元数据存储上等同于一个非分区表,因此分区多会造成一定程度的元数据膨胀,以及小文件碎片。如果您的数据来源于数据库,不建议使用分区表。过多的分区会引起额外的IO资源浪费,为改善此问题并实现索引过滤加速查询的效果,您可以将常用分区条件作为segment_key

使用限制

  • Hologres暂不支持插入数据至分区表父表,只支持插入数据至具体的分区表子表。

    说明

    实时计算Flink版支持实时写入数据至Hologres的分区表父表,详情请参见实时写入数据至Hologres的分区结果表

  • 一个分区规则只能创建一个分区表。

  • PARTITION BY类型仅支持LIST分区,切分PARTITION BY LIST只能取唯一值。

  • 若是表有主键,分区键必须是主键的一个子集。

注意事项

  • 如果单日分区数据小于1亿条,不建议使用日作为分区条件,或创建分区表。分区表太小,查询加速效果不明显,可以选择较大粒度的分区。

  • 如果您需要经常对某分区数据进行整体替换,包括执行truncate操作或者drop操作,建议使用分区表。针对该场景,执行truncate或者drop效果更好,可以避免大范围的删除操作。

创建分区表

语法说明

创建分区表的命令格式如下。

--创建分区父表语句
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name>  ([
  {
   <column_name> <column_type> [ <column_constraints>, [...]]
   | <table_constraints>
   [, ...]
  }
])
PARTITION BY LIST(<column_name>);

--创建分区子表语句
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> PARTITION OF <parent_table>
  FOR VALUES IN (<string_literal>);

参数说明

创建分区表的参数说明如下。

参数

说明

if not exists

如果已经存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表关系已存在。

schema_name

表所在的schema名称,若是在同一个schema创建父表和子表,可以不需要指定schema名称。若是需要跨schema创建父表和子表,需要指定schema名称。

table_name

需要创建的分区父表或分区子表的名称。

column_name

新表中要创建的字段名。

column_type

字段的数据类型。

column_constraints

列约束的名称。

table_constraints

表约束的名称。

parent_table

子表对应的父表名称。

string_literal

分区键。

支持将TEXTVARCHAR以及INT类型的数据作为分区键(Partition Key),V1.3.22及以上版本支持将DATE类型设为分区键。

使用示例

  • 示例1:在public schema下创建不带主键的分区父表和对应的分区子表。

    • V2.1版本起支持的语法:

      BEGIN;
      CREATE TABLE public.hologres_parent (
          a TEXT,
          b INT,
          c TIMESTAMP,
          d TEXT
      )
      PARTITION BY LIST (a) 
      WITH (orientation = 'column');
      CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN ('v1');
      CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN ('v2');
      CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN ('v3');
      COMMIT;
    • 所有版本支持的语法:

      BEGIN;
      CREATE TABLE public.hologres_parent(
        a TEXT, 
        b INT, 
        c TIMESTAMP, 
        d TEXT
      ) 
        PARTITION BY LIST(a);
      CALL set_table_property('public.hologres_parent', 'orientation', 'column');           
      CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN('v1');
      CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN('v2');
      CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN('v3');
      COMMIT;
  • 示例2:在public schema下创建带主键的分区父表和对应的分区子表。

    V2.1版本起支持的语法:

    BEGIN;
    CREATE TABLE public.hologres_parent_2 (
        a TEXT,
        b INT,
        c TIMESTAMP,
        d TEXT,
        ds TEXT,
        PRIMARY KEY (ds, b)
    )
    PARTITION BY LIST (ds) 
    WITH (orientation = 'column');
    CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201215');
    CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201216');
    CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201217');
    COMMIT;

    所有版本支持的语法:

    BEGIN;
    CREATE TABLE public.hologres_parent_2(
      a TEXT , 
      b INT, 
      c TIMESTAMP, 
      d TEXT,
      ds TEXT,
      primary key(ds,b)
      )
      PARTITION BY LIST(ds);
    CALL set_table_property('public.hologres_parent_2', 'orientation', 'column');
    CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201215');
    CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201216');
    CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201217');
    COMMIT;

查看所有分区子表

您可以通过如下两种方法查看当前分区父表下所有的分区子表:

  • 通过HoloWeb可视化查看,HoloWeb会展示分区父表下面的所有分区子表。

  • 通过执行如下命令语句,查看当前分区父表下所有的分区子表。其中,您可以将parent_table_name修改为实际的父表名称。

    SELECT
        nmsp_parent.nspname AS parent_schema,
        parent.relname      AS parent,
        nmsp_child.nspname  AS child_schema,
        child.relname       AS child
    FROM pg_inherits
        JOIN pg_class parent            ON pg_inherits.inhparent = parent.oid
        JOIN pg_class child             ON pg_inherits.inhrelid   = child.oid
        JOIN pg_namespace nmsp_parent   ON nmsp_parent.oid  = parent.relnamespace
        JOIN pg_namespace nmsp_child    ON nmsp_child.oid   = child.relnamespace
    WHERE parent.relname='parent_table_name'; 

分区子表和父表约束一览表

分区子表在绑定父表时,其约束关系如下表所示。其中:

  • 与父表保持一致:即对应的属性分区子表必须和父表保持一致。若不一致,在分区子表绑定(ATTACH)父表时会报错。此时,推荐您使用CREATE TABLE LIKE命令创建子表。

  • 不要求与父表一致:即对应的属性分区子表可以与父表不一致,如果子表没有显式指定属性,则会继承父表的属性,若是子表显式指定属性,则会保留子表的属性。

  • 索引列必须包含父表的索引列:即分区子表的索引列必须包含父表的索引列,还能显式再指定其他列。

分类

表属性

描述

create table partition of 时是否继承父表属性

ATTACH时与父表的约束关系

表属性

orientation

表存储格式。

继承

与父表保持一致。

table_group

Table Group属性包含Shard Count。

继承

与父表保持一致。

time_to_live_in_seconds

表数据生命周期。

继承

不要求与父表一致。

  • 子表属性未赋值,继承父表属性。

  • 子表属性已赋值,保留子表属性。

索引

primary key

主键。

继承

与父表保持一致。

distribution_key

分布键。

继承

与父表保持一致。

clustering_key

聚簇索引。

继承

与父表保持一致。

event_time_column

分段键。

继承

与父表保持一致。

bitmap_columns

比特编码。

继承

不要求与父表一致。

dictionary_encoding_columns

字段编码。

继承

不要求与父表一致。

binlog_level

是否开启Binlog。

继承

与父表保持一致。

proxima_vectors

向量检索索引。

继承

与父表保持一致。

列约束

nullable

非空约束。

继承

与父表保持一致。

default value

默认值。

继承

与父表保持一致。

相关文档

  • 您可以使用Hologres的动态分区功能,无需预先设定所有分区信息,可依据创建分区表时配置的动态分区规则,自动创建并管理分区子表。关于动态分区的管理详情,请参见动态分区管理

  • 您可以通过ALTER PARTITION TABLE语句修改分区,详情请参见ALTER PARTITION TABLE

  • 您可以通过DROP PARTITION TABLE语句用于删除多余分区表,详情请参见DROP PARTITION TABLE