PostgreSQL Tips: Partisjonering av tabeller
Hvorfor partisjonere tabeller
Partisjonering kan gjøre søk raskere, fungere som en enkel form for lastbalansering, og lar deg for eksempel lagre de mest brukte dataene på raskere disker, bedre servere osv, mens eldre eller mindre brukte data lagres på mindre kostbare medier. Det er enkelt å sette opp, og PostgreSQL holder orden på partisjonene automatisk for oss.
Hvordan partisjonere tabeller
Å partisjonere en tabell i PostgreSQL betyr å dele en stor tabell inn i mindre, fysiske deler (partisjoner) basert på en nøkkel De tre vanlige typene er rekkevidde (range), liste (list) og hash.
Her er et enkelt eksempel hvor vi partisjonerer etter år (dvs range):
-- 1. Lag hovedtabellen
CREATE TABLE salg (
id int generated always as identity,
dato DATE NOT NULL,
salg INT )
PARTITION BY RANGE (dato);
-- 2. Lag partisjoner for egne tidsrom
CREATE TABLE salg_2025 PARTITION OF salg FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');
CREATE TABLE salg_2026 PARTITION OF salg FOR VALUES FROM ('2026-01-01') TO ('2027-01-01');
\d salg
Partitioned table "partisjonering.salg2"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+------------------------------
id | integer | | not null | generated always as identity
dato | date | | not null |
salg | integer | | |
Partition key: RANGE (dato)
Publications:
"terjepub"
Number of partitions: 2 (Use \d+ to list them.)
Vi setter inn rader i hovedtabellen salg, og PostgreSQL putter automatisk data i en av de to partisjonene etter hvilket årstall dato-feltet har. Vi søker også i hovedtabellen salg og PostgreSQL søker bare i den partisjonen som inneholder data for det året vi søker etter.
Velge ulike lagringsmedier for partisjonene
Hvis vi vil lagre patisjonene på ulike disker, må vi først opprette ulike tablespaces:
CREATE TABLESPACE fast_disk LOCATION '/mnt/fast_ssd/pg_data';
CREATE TABLESPACE slow_disk LOCATION '/mnt/large_hdd/pg_archive';
Når vi lager partisjonene, angir vi bare hvilken tablespace de skal bruke:
CREATE TABLE salg_2025 PARTITION OF salg FOR VALUES FROM ('2025-01-01') TO ('2026-01-01') tablespace slow_disk;
CREATE TABLE salg_2026 PARTITION OF salg FOR VALUES FROM ('2026-01-01') TO ('2027-01-01') tablespace fast_disk;
Enkelt og greit