DBAtlas · Atlas de operações de banco de dados

Anexar uma tabela preparada como partição com um lock curto (ATTACH PARTITION)

PostgreSQLParticionamento

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;

O que faz

Transforma em partição dados carregados em uma tabela separada, sem full scan nem locks longos, usando uma constraint CHECK previamente validada que corresponde aos limites e índices pré-criados.

Quando usar

Para cargas em massa (ETL) ou restaurações a partir de arquivo: prepare os dados sem tocar na tabela em uso e depois coloque-os online em um único passo.

Atenção

ATTACH obtém SHARE UPDATE EXCLUSIVE no pai e ACCESS EXCLUSIVE na tabela sendo anexada. Sem um CHECK válido correspondente, a tabela é varrida por completo sob esse lock para validar os limites; se faltarem índices correspondentes aos do pai, o ATTACH os cria sob o lock, então prepare ambos com antecedência. Se existir uma partição default, ela também é varrida para provar que não contém linhas no novo intervalo (veja a receita de partição default). Nomes e tipos de colunas devem coincidir exatamente com os do pai; criar a tabela com LIKE ... INCLUDING é a forma mais segura.

Abrir no DBAtlas →

Relacionados