DBAtlas · Atlas d'exploitation des bases de données

Attacher une table préparée comme partition avec un verrou court (ATTACH PARTITION)

PostgreSQLPartitionnement

Commande

-- 1) Prepare the data in a separate table without touching the live table
CREATE TABLE sales_2027_01 (LIKE sales INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
-- ... bulk load (COPY / INSERT) ...
ALTER TABLE sales_2027_01 ADD PRIMARY KEY (id, created_at);
CREATE INDEX CONCURRENTLY sales_2027_01_customer_id_idx ON sales_2027_01 (customer_id);

-- 2) A CHECK that exactly matches the bounds: avoids a full scan during ATTACH
ALTER TABLE sales_2027_01 ADD CONSTRAINT sales_2027_01_bound_chk
  CHECK (created_at IS NOT NULL AND created_at >= DATE '2027-01-01' AND created_at < DATE '2027-02-01') NOT VALID;
ALTER TABLE sales_2027_01 VALIDATE CONSTRAINT sales_2027_01_bound_chk;

-- 3) Attach (SHARE UPDATE EXCLUSIVE on the parent; reads/writes continue)
SET lock_timeout = '5s';
ALTER TABLE sales ATTACH PARTITION sales_2027_01
  FOR VALUES FROM ('2027-01-01') TO ('2027-02-01');
RESET lock_timeout;

-- 4) Drop the now redundant CHECK
ALTER TABLE sales_2027_01 DROP CONSTRAINT sales_2027_01_bound_chk;

Ce que fait la commande

Transforme en partition des données chargées dans une table séparée, sans parcours complet ni verrous longs, grâce à une contrainte CHECK prévalidée correspondant aux bornes et à des index construits à l'avance.

Quand l'utiliser

Pour les chargements en masse (ETL) ou les restaurations depuis une archive : préparez les données sans toucher à la table active, puis mettez-les en ligne en une seule étape.

Attention

ATTACH prend SHARE UPDATE EXCLUSIVE sur le parent et ACCESS EXCLUSIVE sur la table attachée. Sans CHECK valide correspondant, la table est entièrement parcourue sous ce verrou pour valider les bornes ; si les index correspondant à ceux du parent manquent, ATTACH les construit sous le verrou, préparez donc les deux à l'avance. Si une partition par défaut existe, elle est aussi parcourue pour prouver qu'elle ne contient aucune ligne de la nouvelle plage (voir la procédure sur la partition par défaut). Les noms et types de colonnes doivent correspondre exactement au parent ; créer la table avec LIKE ... INCLUDING est le moyen le plus sûr.

Ouvrir dans DBAtlas →

Voir aussi