====== Partitioning ======
===== List =====
CREATE TABLE USERS_PART (
user_id serial,
username varchar(50),
user_role varchar(1),
created_date DATE DEFAULT CURRENT_DATE,
last_updated_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) PARTITION BY LIST (user_role);
-- Inserts would currently fail as we haven't defined any partitions for this table
CREATE TABLE USERS_PART_A
PARTITION OF USERS_PART
FOR VALUES IN ('A');
-- Inserts will now only work with a user_role of A
===== Range =====
CREATE TABLE USERS_PART (
user_id serial,
username varchar(50),
user_role varchar(1),
created_date DATE DEFAULT CURRENT_DATE,
last_updated_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) PARTITION BY RANGE (created_date);
-- Inserts would currently fail as we haven't defined any partitions for this table
CREATE TABLE USERS_PART_2021
PARTITION OF USERS_PART
FOR VALUES FROM ('2021-01-01') TO ('2021-12-31');
-- Inserts will now only work when the created date is in 2021
===== Default =====
From Postgres 11 it is possible to create a default partition. \\
CREATE TABLE USERS_PART_DF PARTITION OF USERS_PART DEFAULT;
===== Select / Insert =====
It is possible to show which partitioned table your select or insert query has used. \\
SELECT tableoid, tableoid::regclass, * FROM users_part
WHERE user_role = 'A';
INSERT INTO users_part (username, user_role)
VALUES ('bloggs01', 'A')
RETURNING tableoid::regclass, user_id;
===== Example =====
[[PGPartitionExample| Partitioning Example]]\\