Rychlejší dotazy, snadnější údržba velkých tabulek.
Range partitioning¶
CREATE TABLE orders ( id SERIAL, created_at TIMESTAMPTZ NOT NULL, total DECIMAL ) PARTITION BY RANGE (created_at); CREATE TABLE orders_2024_q1 PARTITION OF orders FOR VALUES FROM (‘2024-01-01’) TO (‘2024-04-01’);
List partitioning¶
CREATE TABLE logs (id SERIAL, level TEXT, message TEXT) PARTITION BY LIST (level); CREATE TABLE logs_error PARTITION OF logs FOR VALUES IN (‘error’,’fatal’);
pg_partman¶
CREATE EXTENSION pg_partman; SELECT partman.create_parent(‘public.orders’,’created_at’,’native’,’monthly’);
- 100M+ řádků
- Time-series data
- DROP PARTITION místo DELETE
Best practices¶
Partitioning se vyplatí od přibližně 100 milionů řádků nebo když potřebujete efektivně mazat staré záznamy (DROP PARTITION je okamžitý, DELETE může trvat hodiny). PostgreSQL automaticky provádí partition pruning — dotaz s WHERE podmínkou na partition key čte pouze relevantní partitions.
Pro časové řady je range partitioning podle měsíce nebo týdne nejčastější volba. Zvažte použití pg_partman pro automatickou správu — vytváří nové partitions dopředu a může archivovat nebo mazat staré. Hash partitioning je užitečný pro rovnoměrnou distribuci dat, například podle tenant_id v multi-tenant aplikacích. Nezapomeňte, že indexy je třeba vytvořit na každé partition zvlášť, i když PostgreSQL 11+ to umí automaticky přes partitioned indexes.
Partitioning pro velké tabulky¶
Zrychlí dotazy a zjednoduší údržbu.