全部產品
Search
文件中心

Hologres:CREATE PARTITION TABLE

更新時間:Jun 30, 2024

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

命令說明

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類型設為分區鍵。

  • 使用樣本。

    建立分區表的SQL語句樣本如下。

    • 樣本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 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