CREATE PARTITION TABLE語句用于創建分區表。本文為您介紹CREATE PARTITION TABLE的用法。
命令說明
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
分區鍵。
支持將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。