Aylık range partition'lı tablo oluştur (partition'ları döngüyle üret)
PostgreSQLPartitionKomut
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.
İlgili
- Hazırlanmış tabloyu partition olarak kısa lock ile ekle (ATTACH PARTITION)
- Eski partition'ı canlı trafiği bloklamadan ayır (DETACH CONCURRENTLY)
- Default partition tuzağı: yeni partition 'would be violated by some row' hatası verirse
- Partition pruning'in (planlama ve çalışma zamanı) gerçekten çalıştığını doğrula
- pg_partman ile partition oluşturma ve retention'ı otomatikleştir