當前運行的 Oracle 數據庫,有個大表數據量幾百 GB,擔心 PostgreSQL 應付不了?其實,不用擔心,PostgreSQL 有各種應付大數據量存儲的武器,比如:分區表。
為什么要對表進行分區?
表分區允許將一個大表拆分為多個小表,這樣可以帶來以下好處:
分區方式
假設我們有一個表:
CREATE TABLE measurements (
id int8 NOT NULL,
value float8 NOT NULL,
date timestamptz NOT NULL
);
您可以通過提供用作分區鍵的列,來對該表進行分區:
CREATE TABLE measurements (
id int8 NOT NULL,
value float8 NOT NULL,
date timestamptz NOT NULL
) PARTITION BY RANGE (date);
PostgreSQL 支持多種分區方式,這些方式的區別僅在于它們為分區鍵指定行值的方式。
按范圍分區
按范圍分區允許為分區指定一個值的范圍,例如,我們可以將每個月的數據存儲在一個單獨的分區中:
CREATE TABLE measurements_y2021m01 PARTITION OF measurements
FOR VALUES FROM ('2021-01-01') TO ('2021-02-01');
按列表分區
列表分區允許為分區指定一個值列表,例如,我們可以將一小部分經常訪問的數據存儲在熱分區中,并將其余的數據移動到冷分區:
CREATE TABLE measurements (
id int8 PRIMARY KEY,
value float8 NOT NULL,
date timestamptz NOT NULL,
hot boolean
) PARTITION BY LIST (hot);
CREATE TABLE measurements_hot PARTITION OF measurements
FOR VALUES IN (TRUE);
CREATE TABLE measurements_cold PARTITION OF measurements
FOR VALUES IN (NULL);
然后,您可以通過更改hot
列,在分區之間移動行:
-- Move rows to measurements_hot
UPDATE measurements SET hot = TRUE;
-- Move rows to measurements_cold
UPDATE measurements SET hot = NULL;
按哈希分區
按哈希分區允許將行均勻地分布到一組表中,例如,我們可以為表創建 3 個分區,并使用一種相除取余的哈希方法,為行選擇一個分區:
CREATE TABLE measurements (
id int8 PRIMARY KEY,
value float8 NOT NULL,
date timestamptz NOT NULL
) PARTITION BY HASH (id);
CREATE TABLE measurements_1 PARTITION OF measurements
FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE measurements_2 PARTITION OF measurements
FOR VALUES WITH (MODULUS 3, REMAINDER 1);
CREATE TABLE measurements_3 PARTITION OF measurements
FOR VALUES WITH (MODULUS 3, REMAINDER 2);
由于使用了哈希,這些分區將會接收大致相同數量的行。
管理分區
PostgreSQL 允許分離和附加分區:
ALTER TABLE measurements DETACH PARTITION measurements_y2021m01;
ALTER TABLE measurements ATTACH PARTITION measurements_y2021m01
FOR VALUES FROM ('2021-01-01') TO ('2021-02-01');
您可以使用這些命令對現有表進行分區,而無需移動任何數據:
-- Use the existing table as a partition for the existing data.
ALTER TABLE measurements RENAME TO measurements_y2021m01;
-- Create the partitioned table.
CREATE TABLE measurements (LIKE measurements_y2021m01 INCLUDING DEFAULTS INCLUDING CONSTRAINTS)
PARTITION BY RANGE (date);
-- Attach the existing partition with open left constraint.
ALTER TABLE measurements ATTACH PARTITION measurements_y2021m01
FOR VALUES FROM ('0001-01-01') TO ('2021-02-01');
-- Use proper constraints for new partitions.
CREATE TABLE measurements_y2021m02 PARTITION OF measurements
FOR VALUES FROM ('2021-02-01') TO ('2021-03-01');
總結
本教程介紹了如何在 PostgreSQL 中,使用表分區將大型數據表拆分為較小的部分。
該文章在 2024/7/18 12:14:38 編輯過