Bilgi Bankası
PostgreSQLPerformans ve kapasite 17 dk 14.06.2026

PostgreSQL partitioning: büyüyen tabloda ne zaman parçalama gerekir?

PostgreSQL’de tablo büyüdüğünde ilk soru “partition açalım mı?” olur. Bazen doğru cevaptır; bazen de yanlış indeks, eski veri yaşam döngüsü veya yavaş sorguyu saklayan pahalı bir mimari değişikliktir.

Bu yazı sana şu durumda yardımcı olur
  • tek tablo yüz milyonlarca satıra ulaştı
  • tarih aralığıyla çalışan sorgular yavaşlıyor
  • eski veriyi silmek veya arşivlemek zorlaşıyor
  • indeksler büyüdükçe bakım süreleri uzuyor
  • vacuum ve autovacuum aynı tabloda yetişmekte zorlanıyor
Yazıyı bitirince

Partitioning kararını veri yaşam döngüsü, sorgu deseni, indeks büyüklüğü ve bakım ihtiyacıyla birlikte değerlendirebileceksiniz.

TürkDB açısından ürünleşme notu

Bu bölüm, TürkDB’nin ilgili problemi hangi ürün ilkeleri ve kontrol noktalarıyla ele alacağını anlatır. Kapsam, gerçek iş yükü ve ihtiyaçla birlikte netleşir.

TürkDB PostgreSQL tarafında yedek, PITR, bakım penceresi ve gözlem zeminini ürünleştirmeyi hedefler; partition tasarımını sizin yerinize seçmemelidir. Bu iyi bir ayrımdır: partition, ürünün veri erişim biçimine göre verilmesi gereken bir modelleme kararıdır.

Partitioning performans sihri değildir

Partitioning büyük tabloyu daha küçük fiziksel parçalara böler. Bu, doğru sorgularda daha az veri okumayı ve eski veriyi daha kolay yönetmeyi sağlar. Ama sorgular partition anahtarını kullanmıyorsa sistem yine çok fazla parça gezebilir.

Bu yüzden partitioning kararından önce sorguların gerçekten hangi alanlarla filtrelediğini görmek gerekir. Tarih aralığı her sorguda varsa range partition mantıklı olabilir; yoksa partitioning yalnızca bakım maliyetini artırabilir.

  • Sorgular partition anahtarını düzenli kullanıyor mu?
  • Eski veri drop/archive ihtiyacı var mı?
  • Tek partition altında indeks boyutu hâlâ yönetilebilir mi?
  • Partition sayısı planlama ve bakım maliyetini artıracak mı?

Önce tablo ve indeks büyümesini ölçün

Büyük tablo hissi yerine ölçüm gerekir. Tablo boyutu, indeks boyutu, satır dağılımı ve sorguların tarih aralığı kullanımı birlikte okunmalıdır. Tek başına satır sayısı partitioning için yeterli gerekçe değildir.

Tablo ve indeks büyüklüğü

postgres-partition-size.sql
SELECT
  relname,
  pg_size_pretty(pg_relation_size(relid)) AS table_size,
  pg_size_pretty(pg_indexes_size(relid)) AS index_size,
  pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;

Tarih dağılımını görmek

postgres-date-distribution.sql
SELECT date_trunc('month', created_at) AS month, count(*)
FROM events
GROUP BY month
ORDER BY month DESC
LIMIT 24;

Range partitioning ne zaman iyi çalışır?

Zaman serisi, event, log, ödeme hareketi veya sipariş geçmişi gibi verilerde sorgular çoğu zaman tarih aralığıyla çalışır. Bu durumda aylık veya günlük range partition, hem sorgu pruning hem de eski veriyi yönetmek için güçlü olabilir.

Ama çok küçük partitionlar planlama maliyeti ve bakım karmaşası yaratır. Günlük partition mı aylık partition mı sorusu veri hacmi, retention ve sorgu aralığıyla birlikte düşünülmelidir.

Basit range partition örneği

postgres-partitioning.sql
CREATE TABLE events (
  tenant_id uuid NOT NULL,
  created_at timestamptz NOT NULL,
  event_name text NOT NULL,
  payload jsonb NOT NULL
) PARTITION BY RANGE (created_at);

CREATE TABLE events_2026_06 PARTITION OF events
FOR VALUES FROM ('2026-06-01') TO ('2026-07-01');

CREATE INDEX ON events_2026_06 (tenant_id, created_at DESC);

Migration planı olmadan partitioning yapmayın

Mevcut büyük tabloyu partitionlı yapıya taşımak canlı sistemde dikkat ister. Yeni tablo, kopyalama, trigger/CDC, kısa kesinti, doğrulama ve rollback planı olmadan “ALTER ile hallederiz” yaklaşımı risklidir.

TürkDB tarafında PITR, yedek ve bakım penceresi bu tür işlerde hedeflenen güvenlik ağıdır. Yine de partitioning geçişi uygulama ve veri modeli seviyesinde planlanmalıdır.

Geçiş öncesi güvenlik kontrolü

postgres-partition-preflight.sh
turkdb backup create app-pg
turkdb cluster pitr window app-pg
turkdb cluster events app-pg --limit 20
Bu TürkDB bloğu kavramsal ürün akışını anlatır; mevcut çalışan komut, garanti edilen özellik veya teslim tarihi vaadi olarak okunmamalıdır.
Devam etmek istersen

Sorunu motor bazında derinleştirin

Benzer belirtiler farklı motorlarda farklı nedenlere dayanır; yayınlanan tüm rehberleri ana sayfadan takip edebilirsiniz.

Tüm makaleler