DBAtlas · Veritabanı operasyon atlası

Hazırlanmış tabloyu partition olarak kısa lock ile ekle (ATTACH PARTITION)

PostgreSQLPartition

Komut

-- 1) Veriyi canlı tabloyu etkilemeden ayrı tabloya hazırla
CREATE TABLE satislar_2027_01 (LIKE satislar INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
-- ... toplu yükleme (COPY / INSERT) ...
ALTER TABLE satislar_2027_01 ADD PRIMARY KEY (id, tarih);
CREATE INDEX CONCURRENTLY satislar_2027_01_musteri_id_idx ON satislar_2027_01 (musteri_id);

-- 2) Sınırla birebir eşleşen CHECK: ATTACH sırasında tam tablo taramasını önler
ALTER TABLE satislar_2027_01 ADD CONSTRAINT satislar_2027_01_bound_chk
  CHECK (tarih IS NOT NULL AND tarih >= DATE '2027-01-01' AND tarih < DATE '2027-02-01') NOT VALID;
ALTER TABLE satislar_2027_01 VALIDATE CONSTRAINT satislar_2027_01_bound_chk;

-- 3) Ekle (parent'ta SHARE UPDATE EXCLUSIVE; okuma/yazma devam eder)
SET lock_timeout = '5s';
ALTER TABLE satislar ATTACH PARTITION satislar_2027_01
  FOR VALUES FROM ('2027-01-01') TO ('2027-02-01');
RESET lock_timeout;

-- 4) Artık gereksiz olan CHECK'i kaldır
ALTER TABLE satislar_2027_01 DROP CONSTRAINT satislar_2027_01_bound_chk;

Ne yapar?

Ayrı tabloya yüklenmiş veriyi, sınırla eşleşen önceden doğrulanmış CHECK constraint'i ve hazır index'lerle tam tablo taraması ve uzun lock olmadan partition'a dönüştürür.

Ne zaman kullanılır?

Toplu veri yüklemede (ETL) veya arşivden geri getirmede, veriyi canlı tabloyu etkilemeden hazırlayıp tek adımda devreye almak için.

Dikkat

ATTACH parent üzerinde SHARE UPDATE EXCLUSIVE, eklenen tabloda ACCESS EXCLUSIVE lock alır. Eşleşen geçerli bir CHECK yoksa sınır doğrulaması için tablo bu lock altında baştan sona taranır; parent'taki index'lerin karşılığı yoksa ATTACH onları lock altında oluşturur, ikisini de önceden hazırla. Default partition varsa yeni aralıkta satır içermediği de taranarak doğrulanır (bkz. default partition reçetesi). Kolon adları ve tipleri parent ile birebir aynı olmalıdır; LIKE ... INCLUDING ile oluşturmak en güvenlisidir.

DBAtlas'ta aç →

İlgili