全部產品
Search
文件中心

Hologres:CREATE PARTITION TABLE

更新時間:Jun 21, 2025

CREATE PARTITION TABLE語句用於建立分區表(Partition Table)。本文為您介紹CREATE PARTITION TABLE的用法。

命令說明

說明

下文無特殊說明的父表和子表皆指分區的父表和子表。

父表按分區鍵(Partition Key)的值劃分為不同的子表,子表對外可見,分區表在使用時,需要提前建立子表。您可以通過CREATE PARTITION TABLE命令建立分區表,使用動態分區管理功能自動建立分區子表。

分區表的不同分區子表採用不同的檔案儲存體,查詢時帶上分區條件,指定所需查詢的分區,避免全表掃描,快速定位隱藏檔,提高處理效率。通常將事實表按照日期劃分為不同的分區。分區表的任何一個子表在中繼資料存放區上等同於一個非分區表,因此分區多會造成一定程度的中繼資料膨脹,以及小檔案片段。如果您的資料來源於資料庫,不建議使用分區表。過多的分區會引起額外的IO資源浪費,為改善此問題並實現索引過濾加速查詢的效果,您可以將常用分區條件作為segment_key

使用限制

  • Hologres暫不支援插入資料至分區表父表,只支援插入資料至具體的分區表子表。

    說明

    Realtime ComputeFlink版支援即時寫入資料至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