DBAtlas · Atlas de operaciones de bases de datos

Conectar una tabla preparada como partición con un bloqueo breve (ATTACH PARTITION)

PostgreSQLParticionamiento

Comando

-- 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;

Qué hace

Convierte en partición los datos cargados en una tabla aparte, sin full scan ni bloqueos largos, usando una restricción CHECK prevalidada que coincide con los límites e índices construidos de antemano.

Cuándo usarlo

Para cargas masivas (ETL) o restauraciones desde archivo: preparar los datos sin tocar la tabla activa y luego ponerlos en línea en un solo paso.

Precaución

ATTACH toma SHARE UPDATE EXCLUSIVE sobre el padre y ACCESS EXCLUSIVE sobre la tabla que se conecta. Sin un CHECK válido coincidente, la tabla se recorre por completo bajo ese bloqueo para validar los límites; si faltan índices que coincidan con los del padre, ATTACH los construye bajo el bloqueo, así que prepare ambos de antemano. Si existe una partición default, también se recorre para demostrar que no contiene filas del nuevo rango (vea la receta de la partición default). Los nombres y tipos de columna deben coincidir exactamente con los del padre; crear la tabla con LIKE ... INCLUDING es la forma más segura.

Abrir en DBAtlas →

Relacionado