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
分區鍵。
支援將TEXT、VARCHAR以及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。