創建分區表的主要語法包含兩部分:創建主表和創建分區。
建主表語法如下:
CREATE TABLE table name ( ... )
[ PARTITION BY { RANGE I LIST ) ( { column name I ( expression ) )
創建主表時須指定分區方式,可選的分區方式為 RANGE 范圍分區或 LIST 表分區,并指定宇段或表達式作為分區鍵。
創建分區的語法如下:
CREATE TABLE table name
PARTITION OF parent_table [ (
) ] FOR VALUES partition_bound_spec
創建分區時必須指定是哪張表的分區,同時指定分區策略 partition_bound_spec,如果是范圍分區,partition_bound_spec 須指定每個分區分區鍵的取值范圍 ,如果是列表分區 partition_bound_spec,需指定每個分區的分區鍵值。
例子:
CREATE TABLE log_par(
id serial,
user_id int4,
create_time timestamp(0) without time zone
) PARTITION BY RANGE(create_time);
表 log_par 指定了分區策略為范圍分區,分區鍵為 create_time 宇段。
創建分區,并設置分區的分區鍵取值范圍,如下所示:
CREATE TABLE log_par_his PARTITION OF log_par FOR VALUES FROM ('2000-01-01') TO ('2024-01-01');
CREATE TABLE log_par_202401 PARTITION OF log_par FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE log_par_202402 PARTITION OF log_par FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
...
CREATE TABLE log_par_202412 PARTITION OF log_par FOR VALUES FROM ('2024-12-01') TO ('2025-01-01');
注意分區的分區鍵范圍不要有重疊,定義分區鍵范圍實質上給分區創建了約束。給所有分區的分區鍵創建索引,如下所示:
CREATE INDEX idx_log_par_his_ctime ON log_par_his USING btree(create_time);
CREATE INDEX idx_log_par_202401_ctime ON log_par_202401 USING btree(create_time);
CREATE INDEX idx_log_par_202402_ctime ON log_par_202402 USING btree(create_time);
...
CREATE INDEX idx_log_par_202412_ctime ON log_par_202412 USING btree(create_time);
以上三步完成了內置分區表的創建。
內置分區表原理探索
內置分區表原理實際上和傳統分區表一樣,也是使用繼承方式,分區可稱為子表,通過以下查詢很明顯看出表 log_par 和其分區是繼承關系:
\d+ log_par
添加分區
添加分區的操作比較簡單,例如給 log_par 增加一個分區,如下所示:
CREATE TABLE log_par_202501 PARTITION OF log_par FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
之后給分區創建索引,如下所示:
CREATE INDEX idx_log_par_202501_ctime ON log_par_202501 USING btree(create_time);
刪除分區
刪除分區有兩種方法,第一種方法通過 DROP 分區的方式來刪除,如下所示:
DROP TABLE log_par_202501;
DROP 方式直接將分區和分區數據刪除,刪除前需確認分區數據是否需要備份,避免數據丟失。另一種推薦的方法是解綁分區,如下所示:
ALTER TABLE log_par DETACH PARTITION log_par_202501;
解綁分區只是將分區和父表間的關系斷開,分區和分區數據依然保留,這種方式比較穩妥,如果后續需要恢復這個分區,通過連接分區方
式恢復分區即可,如下所示:
ALTER TABLE log_par ATTACH PARTITION log_par_202501 FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');
連接分區時需要指定分區上的約束。
浙公網安備 33010602011771號