DBAtlas · Veritabanı operasyon atlası

Aylık range partition'lı tablo oluştur (partition'ları döngüyle üret)

PostgreSQLPartition

Komut

CREATE TABLE satislar (
  id         bigint GENERATED ALWAYS AS IDENTITY,
  tarih      date   NOT NULL,
  musteri_id bigint NOT NULL,
  tutar      numeric(12,2),
  PRIMARY KEY (id, tarih)
) PARTITION BY RANGE (tarih);

-- Parent'ta tanımlanan index tüm partition'lara otomatik yayılır
CREATE INDEX satislar_musteri_id_idx ON satislar (musteri_id);

-- 2026 yılı için 12 aylık partition
DO $$
DECLARE
  m date;
BEGIN
  FOR m IN SELECT generate_series(date '2026-01-01', date '2026-12-01', interval '1 month')::date LOOP
    EXECUTE format(
      'CREATE TABLE IF NOT EXISTS %I PARTITION OF satislar FOR VALUES FROM (%L) TO (%L)',
      'satislar_' || to_char(m, 'YYYY_MM'), m, (m + interval '1 month')::date);
  END LOOP;
END $$;

-- Hiyerarşi, sınırlar ve boyutlar
SELECT t.relid::regclass AS partition_name,
       t.parentrelid::regclass AS parent,
       t.isleaf,
       t.level,
       pg_get_expr(c.relpartbound, c.oid) AS bounds,
       pg_size_pretty(pg_total_relation_size(t.relid)) AS total_size
FROM pg_partition_tree('satislar') t
JOIN pg_class c ON c.oid = t.relid
ORDER BY t.level, bounds;

Ne yapar?

Tarih kolonuna göre RANGE partition'lı ana tabloyu, tüm partition'lara otomatik yayılan index'i ve döngüyle 12 aylık partition'ı oluşturur; ardından hiyerarşiyi sınırları ve boyutlarıyla listeler.

Ne zaman kullanılır?

Sürekli büyüyen, eski veriyi dönemsel olarak silen (DETACH/DROP) veya sorguları çoğunlukla tarih aralığıyla filtrelenen büyük tablolarda (sipariş, log, zaman serisi).

Dikkat

Partition'lı tabloda PRIMARY KEY/UNIQUE constraint'i partition anahtarını içermek zorundadır (global unique index yoktur). Alt sınır dahil, üst sınır hariçtir (FROM dahil, TO hariç). Gelecek dönemlerin partition'larını önceden oluşturan bir iş (pg_cron, pg_partman) kurulmazsa aralık dışı INSERT hata verir. Binlerce partition planlama süresini ve lock yükünü artırır. Parent'ta CREATE INDEX CONCURRENTLY desteklenmez: parent'ta CREATE INDEX ... ON ONLY, her partition'da CREATE INDEX CONCURRENTLY, ardından ALTER INDEX ... ATTACH PARTITION kullan.

DBAtlas'ta aç →

İlgili