PostgreSQL:內建分割槽表

Ryan_Bai發表於2020-12-14

語法

-- 主表
CREATE TABLE table_name (...)
    [ PARTITION BY { RANGE | LIST } ( {column_name | (expression) } ) ]
    
-- 分割槽
CREATE TABLE table_name
    PARTITION OF parent_table [ (
    )] FOR VALUES partition_bount_spec

建立分割槽表

  1. 建立父表,指定分割槽鍵和分割槽策略

    CREATE TABLE log_par (
        id serial,
        user_id int4,
        create_time timestamp(0) without time zone
    ) PARTITION BY RANGE(create_time)
  2. 建立分割槽,建立分割槽時指定分割槽表的父表和分割槽鍵的取值範圍,注意分割槽鍵的範圍不要有重疊,否則會報錯。

    CREATE TABLE log_par_his PARTITION OF log_par FOR VALUES FROM (UNBOUNDED) TO ('2020-01-01');
    CREATE TABLE log_par_202001 PARTITION OF log_par FOR VALUES FROM ('2020-01-01') TO ('2020-02-01');
    CREATE TABLE log_par_202002 PARTITION OF log_par FOR VALUES FROM ('2020-02-01') TO ('2020-03-01');
    .....
  3. 在分割槽上建立相應索引,通常情況下分割槽鍵上的索引是必須的,非分割槽鍵的索引可根據實際應用場景選擇是否建立。

    CREATE INDEX idx_log_par_his_ctime ON log_par_his USING btree(create_time);
    CREATE INDEX idx_log_par_202001_ctime ON log_par_202001 USING btree(create_time);
    CREATE INDEX idx_log_par_202002_ctime ON log_par_202002 USING btree(create_time);
    .....

新增分割槽

CREATE TABLE log_par_202101 PARTITION OF log_par FOR VALUES FROM ('2021-01-01') TO ('2021-02-01');
 
CREATE INDEX idx_log_par_202101_ctime ON log_par_202101 USING btree(create_time);

刪除分割槽

  1. 直接刪分割槽

    DROP TABLE log_par_202001
  2. 解綁分割槽

    -- 解綁分割槽
    ALTER TABLE log_par DETACH PARTITION log_par_202001;
     
    -- 掛載分割槽
    ALTER TABLE log_par ATTACH PARTITION log_par_202001 FOR VALUES FROM ('2020-01-01') TO ('2020-02-01');

constraint_exclusion 引數

  • ON:所有表都透過約束最佳化查詢

  • OFF:所有表都不透過約束最佳化查詢

  • PARTITION:只有繼承表和 UNION ALL 子查詢透過檢索約束來最佳化查詢;

注意事項

  • 當往父表插入資料時,資料會自動根據分割槽鍵路由規則插入到分割槽中,目前僅支援範圍分割槽和列表分割槽。

  • 分割槽表上的索引、約束需使用單獨的命令建立,目前沒辦法一次性自動在所有分割槽上建立索引、約束。

  • 內建分割槽表不支援定義(全域性)主鍵,在分割槽表的分割槽上建立主鍵是可以的。

  • 內建分割槽表的內部實現使用了繼承。

  • 如果 UPDATE 語句的新紀錄違反當前分割槽鍵的約束則會報錯,UPDATE 語句的新紀錄目前不支援跨分割槽的情況。

  • 效能方面:內建分割槽表根據分割槽鍵查詢相比普通表效能差距較大,因為這種場景分割槽表的執行計劃會掃描所有分割槽;根據分割槽鍵查詢相比普通飆效能有小幅降低,而查詢分割槽表子表效能相比普通表略有提升。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2742072/,如需轉載,請註明出處,否則將追究法律責任。

相關文章