postgresqlpartioning
Table of Contents
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
postgresqlpartioning.txt · Last modified: 2024/03/01 09:36 by z0hpvk