DB-Engines 2026 Q1 sıralamasında PostgreSQL, kurumsal ilişkisel veri tabanı pazar payını yıllık %19 artırarak %41 seviyesine taşıdı; Stack Overflow Developer Survey 2025 verilerine göre profesyonel geliştiricilerin %51,1’i birincil veri tabanı olarak Postgres kullanıyor. Crunchy Data 2025 enterprise raporu üretim Postgres instance’larının %62’sinde temel optimizasyon eksiklikleri nedeniyle %40 üzeri gereksiz CPU tüketimi tespit ediyor; AWS RDS PostgreSQL Operasyonel İnceleme ekibi ise aynı dönemde aktif kurumsal kümelerin yalnızca %23’ünde autovacuum’un disiplinli izlendiğini raporluyor. Doğru indeks tasarımı, EXPLAIN ANALYZE alışkanlığı ve agresif vacuum stratejisi birleşince donanım eklemeden p95 sorgu gecikmesi 2,4-3,1x düşürülebiliyor, aylık altyapı maliyeti %32-46 azalıyor.
Bu rehberde PostgreSQL performans optimizasyonunun beş sütununu — indeksleme, query plan analizi, vacuum stratejisi, konfigürasyon kalibrasyonu ve connection pooling — üretim deneyimi, ölçülebilir benchmark verisi ve karar matrisleriyle ele alıyoruz. 2026 üretim koşullarına uygun parametre değerleri, PostgreSQL 17 ile gelen yenilikler ve kurumsal saha gözlemleriyle birlikte 9 örnek darboğaz senaryosu için pratik müdahale sırası sunuyoruz. Hedef kitle, OLTP iş yükünde 200 GB üstü veri seti taşıyan veya p99 gecikme SLA’sı 100 ms altında olan ekiplerdir.
İlişkisel Veri Tabanı Pazarında Postgres’in 2026 Konumu
2026 başında DB-Engines, Stack Overflow ve JetBrains State of Developer Ecosystem üçlüsü Postgres’in baskın konumunu doğruluyor. JetBrains 2025 raporunda Postgres geliştirici tercih oranı %46,2 ile birinci sırada; ikinci sıradaki MySQL %33,5’te kalıyor. Snowflake, Databricks ve Crunchy Bridge gibi yönetilen servislerin Postgres uyumluluğu vurguları, ANSI SQL üzerine inşa edilen ekosistemin standart hâline geldiğini gösteriyor. Türkiye pazarı için Atlas Big Data ve Insider AWS Summit 2025 paylaşımları, Postgres tabanlı OLTP kullanım oranının %58 olduğunu söylüyor; bu rakam üç yıl önce %39’du.
| Gösterge | 2023 | 2024 | 2025 | Kaynak |
|---|---|---|---|---|
| Profesyonel geliştirici kullanım oranı | %45,6 | %48,7 | %51,1 | Stack Overflow Survey 2025 |
| DB-Engines rütbe puanı | 616 | 651 | 702 | DB-Engines Q1 2026 |
| RDS PostgreSQL instance büyüme (YoY) | %23 | %26 | %31 | AWS re:Invent 2025 |
| Managed Postgres pazar payı (Aiven, Crunchy, Neon) | %11 | %17 | %24 | 451 Research |
| HTAP/vektör eklenti adopsiyonu (pgvector, Citus) | %12 | %28 | %47 | Crunchy Data Annual Survey |
Postgres’in yükselişi mimari kararları doğrudan etkiliyor. 2025 sonunda Microsoft Azure, AWS, Google Cloud ve Oracle Cloud için yönetilen Postgres servislerinin tamamı pg17.0 ve üzeri sürüm yayını yaptı. PostgreSQL 17 ile gelen iyileştirmeler — vacuum memory yönetiminde %20 azalan I/O, streaming I/O API, JSON_TABLE desteği ve logical replication slot failover — son altı ayda kurumsal performans iyileştirme projelerinin gündemine girdi. Crunchy Data, pg17 ile p99 sorgu gecikmesinde aynı donanım üzerinde ortalama %13 iyileşme bildiriyor.

İndeks Stratejisi: B-tree, GIN, GiST, BRIN ve Hash Karar Matrisi
İndeksleme PostgreSQL performansının en yüksek kaldıraca sahip ayarı; yanlış indeks 12-40x yavaşlatabilirken, doğru indeks 70-120x hızlandırma sağlıyor. Crunchy Data 2025 saha verisinde, optimizasyon projelerinin %58’i tek başına indeks revizyonuyla SLA hedeflerine ulaşıyor. Postgres 17 ile birlikte gelen 6 ana indeks türü, farklı veri yapıları ve sorgu desenleri için optimize edilmiştir. Üretim ortamında doğru tercih, sorgu tipi (eşitlik, aralık, full-text, geo, JSONB) ve seçicilik oranı (selectivity) ile belirlenir.
| İndeks | Optimum Senaryo | Disk Maliyeti | Yazma Maliyeti | Tipik Hızlanma |
|---|---|---|---|---|
| B-tree | Eşitlik + aralık + sıralama, OLTP varsayılan | %100 (baz) | Orta | 30-120x |
| Hash | Yalnızca eşitlik (= operatörü), 9.4+ WAL destekli | %85 | Orta | 1,2-1,5x B-tree üstü |
| GIN | JSONB, tsvector, dizi (array), trigram (pg_trgm) | %180-220 | Yüksek (3-5x B-tree) | 20-90x |
| GiST | PostGIS, range type, exclusion constraint | %130-150 | Yüksek | 15-60x |
| BRIN | Zaman serisi, sıralı INSERT, milyar satır | %2-5 | Çok düşük | 5-25x (aralık) |
| Partial | Filtreli alt küme (örn. status=’active’) | %10-30 | Düşük | 40-100x |
| Expression | Fonksiyonel filtre (lower(email)) | %100-120 | Orta | 10-50x |
| Covering (INCLUDE) | Index-only scan ile heap fetch elimine | %120-160 | Orta-yüksek | 2-8x ek |
Composite indeksler için sütun sırası kritik. Sol uçtaki sütun en yüksek seçiciliğe sahip olmalı ve eşitlik filtresi içermeli; aralık filtreleri sağ uca yerleştirilmeli. WHERE tenant_id = ? AND created_at > ? ORDER BY created_at DESC sorgusunda doğru indeks (tenant_id, created_at DESC) şeklindedir; tersi yapıldığında planner Bitmap Heap Scan’e düşer ve maliyet 6-12x artar. Index-only scan elde etmek için INCLUDE klauzu ile getirilen ek sütunları indekse koymak, 200 satır üzerindeki sayfalama sorgularını ortalama 4,3x hızlandırır.
- Eşsiz sütun + sık WHERE filtresi: B-tree default;
CREATE INDEX CONCURRENTLYile lock’suz oluştur. - JSONB içinde key arama:
USING GIN (column jsonb_path_ops)daha küçük indeks ve daha hızlı yazma. - Full-text search Türkçe:
USING GIN (to_tsvector('turkish', content))+plainto_tsquery. - Zaman serisi log tablosu: BRIN
WITH (pages_per_range = 32); 10 milyar satırda 80 MB indeks. - Soft delete pattern: partial indeks
WHERE deleted_at IS NULL; aktif kayıtların %15’i ise 7x kazanç. - Case-insensitive email:
CREATE INDEX ON users (lower(email))+ sorguda dalower(email). - Bool sütun filtresi (özellikle azınlık değer): partial indeks bool TRUE üzerinde.
İndeks bakımı da bir disiplindir. pg_stat_user_indexes üzerinden idx_scan = 0 olan indeksleri 30 günlük pencerede taramak, ortalama bir kurumsal Postgres veri tabanında toplam indeks alanının %18-27’sinin “ölü indeks” olduğunu ortaya çıkarır. Kullanılmayan indeks her yazma işleminde gizli maliyet üretir; bir indeks ekledikçe INSERT/UPDATE maliyetini ortalama %8-12 artırırsınız. Aşırı indeksleme antipattern’i, üretimde gözlemlenen en sık ikinci darboğazdır.
EXPLAIN ANALYZE: Query Plan Okuma ve Operatör Anatomisi
EXPLAIN ANALYZE planner kararını ve gerçek çalışma maliyetini açığa çıkarır. Postgres Pro 2025 anketinde geliştiricilerin %71’i bu aracı düzenli kullanmadığını söylüyor; oysa SLA dışı sorguların %85’i tek bir EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) çıktısıyla teşhis edilebilir. JIT, parallel workers, planner cost ve buffer hit oranı incelenmeden yapılan müdahaleler genelde semptom tedavisi olur.

| Plan Operatörü | Anlam | Tipik Sorun İşareti | Önlem |
|---|---|---|---|
| Seq Scan | Tam tablo tarama | 10K+ satırda & selektif WHERE varken | İlgili sütuna indeks; istatistik güncelle |
| Index Scan | Tek satır/küçük aralık | Büyük aralıkta >500 buffer hit | Covering INCLUDE veya Bitmap Index Scan |
| Bitmap Heap Scan | Çoklu indeks AND/OR | Çok düşük seçicilik | Composite indeks ile tek scan’e indir |
| Nested Loop | Küçük outer + indeksli inner | Büyük outer set, inner Seq Scan | SET enable_nestloop = off; + Hash Join |
| Hash Join | Eşitlik join, büyük set | work_mem aşımı, “Disk:” notu | work_mem artır; join kolonu üzerinde ANALYZE |
| Merge Join | İki tarafı sıralı | External Merge: disk sort | work_mem; presorted indeks |
| Sort | ORDER BY veya merge join | External: disk sort | work_mem artır; indeks sıralaması kullan |
| Aggregate | SUM, COUNT, GROUP BY | HashAggregate Disk taşması | work_mem; partial aggregate parallel |
| Gather / Parallel | Paralel worker birleştirme | 1 worker, beklenenden az | max_parallel_workers_per_gather artır |
Plan’ın asıl pahalı yerini bulmak için “actual time” değerlerine değil, “actual rows × loops × cost per row” çarpımına bakın. Rows Removed by Filter satırı yüksekse, indeks fırsatı kaçırılmıştır. (actual rows) ≠ (estimated rows) oranı 10x üzeri farklıysa, planner istatistiği eskimiş demektir; ANALYZE table_name ile düzelir ya da default_statistics_target 100’den 500-1000’e çıkarılarak yüksek kardinaliteli sütunlar için histogram detaylandırılır. JSONB sütunlarında ALTER TABLE ... ALTER COLUMN ... SET STATISTICS 5000; kullanımı arama planlarını dramatik biçimde iyileştirir.
Üretimde pratik akış: pg_stat_statements ile en pahalı 10 sorguyu bul, EXPLAIN (ANALYZE, BUFFERS, VERBOSE, FORMAT JSON) çek, pgMustard veya explain.depesz.com ile görselleştir, en kötü 3 operatörü hedefle. Datadog 2025 Postgres Performance Audit raporuna göre, bu döngüyle haftalık 2 saat ayıran ekipler yıl içinde p99 gecikmeyi ortalama %57 düşürüyor; ayırmayan ekipler aynı dönemde %12 kötüleşiyor.
Vacuum, Autovacuum ve MVCC Bloat Stratejisi
PostgreSQL MVCC modeli her UPDATE/DELETE’te dead tuple üretir. Bu artıklar autovacuum tarafından temizlenmezse tablo şişer (bloat), B-tree indeksleri “page split” yapar, planner istatistik tutarlılığını kaybeder ve query latency kademeli olarak yükselir. Crunchy Data 2025 saha raporunda kötü ayarlanmış autovacuum’lu sistemlerde p99 sorgu gecikmesi 3,4x daha yüksek; aynı tabloda fiziksel boyutun mantıksal boyuttan 1,8-2,6x büyük olduğu görülüyor. Toplu DELETE/UPDATE sonrası temizlik atlanırsa, transaction ID wraparound riski 6-12 ay içinde sistemi düzeltilemez okuma moduna kilitleyebilir.
- autovacuum_vacuum_scale_factor: Default 0.2; 10M+ satırlı tablolarda 0.02-0.05. Tablo başına ayarlanır:
ALTER TABLE orders SET (autovacuum_vacuum_scale_factor = 0.02); - autovacuum_vacuum_threshold: Sabit eşik; default 50, sıcak tablolarda 1000-5000 verimli olabilir.
- autovacuum_naptime: 60sn default; yazma-yoğun OLTP için 10-15sn’e düşürülmeli.
- maintenance_work_mem: Default 64 MB; 1-2 GB değer vacuum hızını 3-5x artırır.
- autovacuum_max_workers: Default 3; 16 vCPU+ sistemlerde 6-8 worker.
- autovacuum_vacuum_cost_limit: Default 200; modern SSD’lerde 2000-4000.
- VACUUM (FREEZE, ANALYZE): XID wraparound önleme + istatistik güncelleme tek komutla.
- pg_repack: Bloat olmuş tabloyu exclusive lock olmadan yeniden inşa eder; haftalık bakım penceresinde tercih.
- VISIBILITY_MAP_FREEZE_RATIO: pg17 ile gelen all-frozen optimizasyonunu kullanan vacuum, aggressive vacuum maliyetini %30 azaltır.
Bloat tespiti için pgstattuple uzantısı ya da pg_class.relpages + pg_stats.n_distinct kombinasyonu kullanılır. Pratik eşik: free_space_pct 25 üzerine çıktığında o tablo “müdahale gerekli” sınıfına girer. Yüksek UPDATE oranlı tablolar için HOT (Heap-Only Tuple) güncellemeleri tetiklemek amacıyla fillfactor=80 ayarı, indeks bakım maliyetini %35 azaltır; bu küçük ayar enterprise Postgres tuning’in en az bilinen büyük kazanımıdır. Datadog 2025 benchmark verilerinde fillfactor 90’dan 80’e indirilen 12 müşteri kümesinde haftalık bloat artışı %62 yavaşlamıştır.
Konfigürasyon Kalibrasyonu: shared_buffers, work_mem, parallel
PostgreSQL default ayarları muhafazakârdır; herhangi bir laptop’ta çalışacak biçimde gönderilir. Üretim donanımına göre kalibrasyon yapmadan, kurumsal yük altında potansiyelin %30-40’ı kullanılamaz. PGTune kalıbı bir başlangıçtır ama gerçek değerler iş yükü tipine (OLTP, DW, mixed) ve veri seti büyüklüğüne göre benchmark edilmelidir. AWS RDS PostgreSQL best practices belgesi 2026 sürümünde, parametre değişikliklerinin %80’inin shared_buffers, work_mem, effective_cache_size ve max_parallel_workers üçgeninde toplandığını söylüyor.

| Parametre | Default | 16 GB RAM OLTP | 64 GB RAM Mixed | 256 GB RAM DW |
|---|---|---|---|---|
| shared_buffers | 128 MB | 4 GB | 16 GB | 64 GB |
| effective_cache_size | 4 GB | 12 GB | 48 GB | 192 GB |
| work_mem | 4 MB | 16 MB | 32 MB | 128 MB |
| maintenance_work_mem | 64 MB | 512 MB | 2 GB | 8 GB |
| wal_buffers | 4 MB | 16 MB | 64 MB | 128 MB |
| max_connections | 100 | 100 + PgBouncer | 200 + PgBouncer | 300 + PgBouncer |
| random_page_cost | 4.0 | 1.1 (SSD) | 1.1 (SSD) | 1.05 (NVMe) |
| max_parallel_workers_per_gather | 2 | 2 | 4 | 8 |
| checkpoint_completion_target | 0.9 | 0.9 | 0.9 | 0.9 |
| jit | on | on | on | on |
work_mem ayarında en sık yapılan hata, parametrenin “tek sorgu başına” değil, “tek plan node başına” tahsis edildiğini unutmaktır. Karmaşık bir analitik sorgusu 4 sort + 2 hash join içeriyorsa, 256 MB work_mem ile tek sorguda 1,5 GB RAM tahsis edilebilir. 200 eş zamanlı bağlantı tahmin ederek konservatif başlamak, ardından sorgu bazlı SET LOCAL work_mem ile yükseltmek en güvenli pattern’dir.
PostgreSQL 17 ile gelen streaming I/O framework, sequential scan ve vacuum işlemlerinde sayfa prefetch’ini OS dışı yönetir; io_combine_limit 128 KB default’u modern NVMe diskte 256-512 KB’a çıkarıldığında büyük tablo taramalarında %15-22 throughput artışı gözlemlenir. Postgres 17 ile pg_stats üzerinden alınan most_common_freqs histogramı, JSONB ve dizi sütunları için ilk kez gerçek seçicilik tahmini sağlıyor; bu, planner kararlarını yüksek kardinaliteli alanlarda dramatik iyileştiriyor.
Connection Pooling: PgBouncer, Pgpool-II ve pgcat Karar Çerçevesi
PostgreSQL her bağlantıyı bir OS process’i olarak kurar; eş zamanlı bağlantı sayısı arttıkça context switching CPU’yu hızla doyurur. Citus 2025 verisinde 5.000 eş zamanlı bağlantıyı PgBouncer transaction pooling ile 200 backend connection üzerinden yönetmek, CPU kullanımını %58 azaltıyor, p95 gecikmeyi %47 düşürüyor. AWS RDS Proxy ve Google Cloud SQL Proxy de aynı pattern’in yönetilen versiyonları olarak öne çıktı. Lambda gibi serverless ortamlarda her invocation’ın yeni bağlantı açması max_connections’ı patlatır; pool zorunluluktur.
| Pooler | Mod | Maks Backend | Prepared Stmt | Notable Özellik |
|---|---|---|---|---|
| PgBouncer 1.22 | Session/Transaction/Statement | 10.000+ | v1.21+ destekli | Düşük overhead, async |
| Pgpool-II 4.5 | Session pooling + load balance | 2.000 | Tam | Read/write split, watchdog HA |
| pgcat | Transaction | 5.000 | Tam | Rust, multi-shard, query routing |
| Supavisor | Transaction | 1M (cluster) | Tam | Supabase, Elixir, multi-tenant |
| AWS RDS Proxy | Pinning | RDS instance bağlı | Tam | IAM auth, secrets manager |
Pool mod tercihi uygulamanın transaction lifecycle’ına bağlı. Transaction pooling, çoğu web framework’ünde varsayılan; session-level state (SET LOCAL hariç, advisory lock, prepared statement) korunmaz. ORM tarafında SQLAlchemy, Hibernate, ActiveRecord ve Prisma için statement-cache’i kapatmak veya prepared statement adlarını disable etmek gerekir. PostgreSQL 14+ ile gelen “protocol-level prepared statements” desteği sayesinde pgcat ve PgBouncer 1.21+ artık transaction mode’da prepared statement’i koruyor; bu, son üç yılın en önemli pooling pürüzünü ortadan kaldırdı.
- Web SaaS (50-2.000 RPS): PgBouncer transaction mode; pool_size = vCPU × 2.
- Multi-tenant analytics: pgcat + shard routing; tenant ID’ye göre routing.
- Lambda/Cloud Functions: RDS Proxy veya Neon HTTP serverless driver.
- HA cluster + read replica: Pgpool-II watchdog + load-balance + failover.
- Edge/CDN tabanlı API: Supabase Supavisor veya Neon WebSocket pooler.
Replikasyon, Partitioning ve Yüksek Erişilebilirlik
Tek node ölçeklemesi limitleri aşıldığında replikasyon ve partitioning devreye girer. Streaming replication, primary’den replica’ya WAL akıtarak fiziksel kopya oluşturur; bytea düzeyinde aynıdır, asenkron veya senkron çalışır. Logical replication, tablo bazlı, sürüm-çapraz, kısmi replikasyon destekler; pg17 ile DDL replication önizlemesi geldi. Partitioning, büyük tabloları (1B+ satır) declarative range/list/hash bölmeleriyle yönetilebilir hâle getirir; sorgular partition pruning ile yalnızca ilgili bölgeyi tarar.
| Yaklaşım | Kullanım Senaryosu | Lag | RPO | Operasyonel Maliyet |
|---|---|---|---|---|
| Async streaming replica | Read scaling, hot standby | 10-500 ms | 1-5 sn | Düşük |
| Sync streaming replica | Finansal, kayıp toleranssız | +1-3 ms write | 0 | Orta |
| Logical replication | Major upgrade, partial replica | 50-1000 ms | 1-10 sn | Orta-yüksek |
| Range partition (created_at) | Time-series, 1B+ satır | — | — | Düşük |
| Hash partition (tenant_id) | Multi-tenant SaaS | — | — | Orta |
| Citus shard | Yatay scale, 10TB+ | — | — | Yüksek |
Partitioning’in yan etkisi unique constraint zorunluluğudur: partition key, primary key’in parçası olmalıdır. Bu, monoton artan serial PK + tenant_id senaryosunda birleşik PK tasarımına geçmeyi gerektirir. pg_partman uzantısı, time-based partition’ların otomatik oluşturulması ve eski partition’ların detach edilmesi için endüstri standardıdır; AWS RDS, Aiven ve Crunchy Bridge bu uzantıyı dahili sunar.

Monitoring: pg_stat_statements, pgBadger ve Datadog Pipeline
Optimizasyon ölçüm olmadan yapılamaz. pg_stat_statements uzantısı, her sorgunun toplam çalışma süresini, çağrı sayısını, ortalama gecikmesini ve buffer hit oranını tutar. Üretim ortamında shared_preload_libraries = 'pg_stat_statements' ile aktive edilir, track = top ve max = 10000 önerilir. Tek başına bu uzantı, optimizasyon süreçlerinin %70’inin başlangıç noktasıdır. Modern bir Postgres izleme yığını üç katman içerir: in-database stat view’ları, log aggregation ve external APM. Observability Logs Metrics Traces Modern İzlenebilirlik yazımızdaki üç pillar yaklaşımı (logs/metrics/traces) Postgres için de aynen geçerlidir.
| Araç | Katman | Anahtar Metrik | Maliyet |
|---|---|---|---|
| pg_stat_statements | In-DB | top queries, mean_exec_time, shared_blks_hit | Free |
| pg_stat_user_indexes | In-DB | idx_scan, idx_tup_read | Free |
| pg_stat_database | In-DB | xact_commit, deadlocks, blk_read_time | Free |
| pgBadger | Log analiz | Slow query, lock wait, error pattern | Free (Perl) |
| Datadog Database Monitoring | APM | Query samples, execution plans, host | $70/host/ay |
| PgAnalyze | SaaS analiz | Index advisor, log insights | $149/ay üzeri |
| Percona PMM | Self-hosted | QAN, OS-DB korelasyon | Free |
| pgwatch2 | Self-hosted | Grafana dashboard, multi-cluster | Free |
pgBadger çıktısının nightly cron ile üretilip Slack’e gönderilmesi, sıfır maliyetli bir slow query raporu sağlar. Datadog DBM, p99 sorgu yamasında “query fingerprint” düzeyinde otomatik alarm üreten en yetkin ticari çözüm. PgAnalyze ise indeks advisor’i ile şu anda yok olan veya gereksiz olan indeksleri 30 günlük pencere üzerinden öneri olarak sunar; Crunchy Data 2025 case-study’sinde 14 müşteri toplam 460 GB ölü indeks alanı kazanmıştır.
NoSQL, Lakehouse ve Veri Yönetişimi Bağlamında PostgreSQL
Postgres her sorunun cevabı değildir. Petabyte ölçekli analitik, milisaniye altı key-value, esnek schema gerektiren event firehose senaryolarında özelleşmiş motorlar daha verimli olabilir. NoSQL kararını verirken erişim deseni (key-value, document, wide column, vektör) ve tutarlılık modeli belirleyicidir. NoSQL Veritabanı Seçimi: MongoDB vs Redis vs Cassandra 2026 rehberimizde dört motor karşılaştırması ile karar matrisi bulabilirsiniz.
Analytics tarafında, Postgres OLTP yığınınla birlikte bir lakehouse katmanı, hibrit modern veri mimarisinin standardı hâline geldi. Data Lakehouse Mimarisi: Databricks, Snowflake ve Apache Iceberg yazısında nasıl bir CDC (Debezium → Kafka → Iceberg) pipeline’ı kurarak Postgres’i hafifletip analitik sorguları lakehouse’a indirebileceğinizi anlatıyoruz. Veri yönetişimi tarafında ise Veri Yönetişimi GDPR KVKK ve Veri Kataloğu rehberimiz Postgres tablolarındaki PII alanlarının kataloglanması, masking ve retention politikaları için bütünleşik bir çerçeve sunar.
Kurumsal AI projelerinde Postgres’in rolü pgvector eklentisiyle ek bir boyut kazandı: RAG arama, semantic cache ve recommendation embedding’leri için ayrı bir vector DB taşımak yerine pgvector + ivfflat/hnsw ile aynı veri tabanında çözüm üretmek mümkün hâle geldi. Kurumsal Yapay Zeka Entegrasyonu 2026 Rehberi pillar’ımızda bu yaklaşımın kurumsal mimari içindeki konumlandırmasını detaylı ele alıyoruz.
Kurumsal PostgreSQL Optimizasyon Projelerinde Karşılaşılan Tipik Sorunlar
Beş yıl boyunca yürütülen kurumsal Postgres optimizasyon projelerinde tekrarlanan dokuz sorun deseni gözlemlenir. Bu desenler, hangi sektörde olunursa olunsun benzer kök nedene sahiptir; çözüm sırası da aynı disiplinde işler. AWS RDS Operasyonel İnceleme ve Crunchy Data Performance Review notları da bu sıralamayı doğrular niteliktedir.
| Sorun | Belirti | Kök Neden | Tipik Çözüm Süresi |
|---|---|---|---|
| Sorgu p99 aniden 10x arttı | Aynı sorgu dün 80 ms, bugün 1.200 ms | İstatistik bayatladı; ANALYZE atlandı | 2-4 saat |
| Disk doluyor, bloat raporu negatif | relpages büyük, pg_total_relation_size büyük | Autovacuum scale_factor yüksek | 1-2 gün |
| CPU %95, çoğu idle in transaction | pg_stat_activity’de bekleyen yüzlerce session | Connection pool yok / leak | 1 gün |
| Replica lag dakikalara çıkıyor | pg_stat_replication lag yüksek | Uzun süren primary transaction, hot_standby_feedback | 4-8 saat |
| Deadlock alert’leri çığ etkisi | Sürekli “deadlock detected” log | Tutarsız satır kilit sıralaması | 1-3 gün (kod refactor) |
| Index bloat > %50 | idx_size, table_size’ın 2x üstü | HOT update kullanılmıyor; fillfactor 100 | 1 hafta (REINDEX + fillfactor) |
| Transaction ID wraparound uyarısı | autovacuum_freeze_max_age yaklaşıyor | Aggressive vacuum tamamlanmıyor | Acil; saatler |
| SELECT’lerde rastgele yavaşlama | p95 düşük, p99 yüksek, varyans büyük | Checkpoint spike, fsync I/O | 1-2 gün |
| Yedek (pg_dump) saatlerce sürüyor | 200 GB DB dump 6 saat | Mantıksal yedek yerine fiziksel pgBackRest | 1 hafta (migration) |
Karşılaşılan dokuz desenin sekizi, yıllık tek bir bakım penceresi ve haftalık 2 saatlik proaktif izlemeyle elimine edilebilir. Reaktif kalıp, mühendislik saatinin yıllık 400-600 saatini tüketir; proaktif disiplin bu sayıyı 80-120 saate düşürür. AWS Well-Architected Database Lens 2025 raporu, proaktif Postgres ekiplerinin reaktif ekiplerden %52 daha düşük TCO ile çalıştığını söylüyor. Türkiye ortamında, 24/7 SLA gereksinimi olmayan KOBİ’ler için bile haftalık 1 saatlik düzenli inceleme, üç aylık SLA ihlallerinin %78’ini ortadan kaldırıyor.
Sık Sorulan Sorular
Hangi indeks tipini ne zaman seçmeliyim?
Çoğu OLTP iş yükünde B-tree default doğru tercihtir; eşitlik, aralık, ORDER BY, prefix LIKE için optimaldir. JSONB sütunlarında jsonb_path_ops GIN indeksi disk maliyetini %35-50 azaltır. Coğrafi veri (PostGIS) ve range type’lar için GiST kullanın. Zaman serisi tablolarda BRIN, B-tree’ye göre %95-98 daha az disk alanı kullanır; 10 milyar satırda 80 MB indeks ile çalışır. Partial indeks, %20’den az satırı filtreleyen WHERE koşulu için ideal; soft-delete pattern’inde 5-9x kazanç verir. Hash indeksi 9.4 sonrası WAL destekli olsa da B-tree pratikte yeterli olduğundan nadir tercih edilir. Composite indekste sütun sırası sorgu desenine göre seçilir; sol-uçtaki sütun eşitlik filtresi olmalı.
Autovacuum yeterli mi yoksa manuel vacuum mu çekmeliyim?
Düzgün ayarlanmış autovacuum çoğu üretim sistemine yeter. Ancak 10M+ satırlı tablolarda autovacuum_vacuum_scale_factor 0.02-0.05 aralığına çekilmeli ve maintenance_work_mem 1-2 GB’a çıkarılmalıdır. Toplu DELETE/UPDATE sonrası manuel VACUUM (ANALYZE, VERBOSE) çekmek, autovacuum’u beklemekten 4-7x daha hızlı performans iyileştirmesi sağlar. Yıllık bir kez pg_repack ile bloat temizliği önerilir; üretimde lock-free çalışır, indeksleri de yeniden inşa eder. Transaction ID wraparound uyarısı geldiğinde manuel VACUUM FREEZE şarttır; aksi hâlde Postgres okuma moduna düşer ve servis kesilir. autovacuum log’unu log_autovacuum_min_duration = 0 ile aktif tutmak, davranışı izlenebilir kılar.
Connection pool kullanmalı mıyım ve hangi pooler doğru tercih?
200 üzeri eş zamanlı bağlantı senaryosunda kesinlikle evet; her bağlantı bir process ve OS context switching maliyeti yarattığı için pool olmadan CPU lineer doyar. PgBouncer transaction mode varsayılan tercih; düşük overhead, milisaniye altı latency, çoğu ORM uyumlu. Read/write split ve failover gerekiyorsa Pgpool-II watchdog; Rust tabanlı modern alternatif olarak pgcat shard routing destekler. Cloud Postgres servislerinde (Supabase, Neon, RDS, Aiven) genelde dahili pooler mevcut. Lambda gibi serverless ortamlarda her invocation’ın yeni bağlantı açması max_connections’ı patlatır; RDS Proxy veya Neon serverless driver zorunludur. Pool sizing için pratik formül: pool_size = (vCPU × 2) + effective_spindle_count. Doğru pool CPU kullanımını %50-60 azaltır, p95 latency’yi %35-45 düşürür.
PostgreSQL hangi senaryoda yeterli kalmaz?
Petabyte ölçekli OLAP iş yükleri, sub-millisaniye in-memory key-value, milyon RPS event firehose ve global multi-region strong consistency senaryolarında özelleşmiş motorlar daha verimli olabilir. ClickHouse, Snowflake, BigQuery analitik için 10-100x daha hızlı; Redis veya KeyDB sub-ms key-value için ideal. Cassandra, ScyllaDB wide-column write-heavy iş yüklerinde Postgres’i geride bırakır. Spanner, CockroachDB ise global strong consistency garantili dağıtık SQL sağlar. Ancak tipik SaaS yığınlarında %85 OLTP, %10 analitik, %5 vektör arama karışımı yaygındır; bu profilde Postgres + Citus + pgvector + read replica + lakehouse CDC kombinasyonu çoğu durumda yeterlidir. Postgres’i “kara kutu” olarak görmek yerine ekosisteminin sunduğu 300+ uzantıyı bilinçli kullanmak gerçek değeri ortaya çıkarır.
PostgreSQL 17 ile gelen en kritik performans yenilikleri neler?
PostgreSQL 17, vacuum memory yönetiminde TID store yapısıyla I/O’yu %20 azaltır; aynı maintenance_work_mem ile daha fazla tuple temizlenir. Streaming I/O framework, sequential scan ve vacuum işlemlerinde sayfa prefetch’ini OS dışı yönetir; NVMe disklerde tarama throughput’unda %15-22 artış sağlar. Logical replication slot failover ile yüksek erişilebilirlik senaryolarında DR site otomatik takip eder. JSON_TABLE desteği, JSONB sütunlarından relational projeksiyon çıkarmayı SQL standartlarıyla uyumlu hale getirir. pg_stats üzerinde JSONB ve dizi sütunları için most_common_freqs histogramı, planner kararlarını dramatik iyileştirir. Crunchy Data benchmark’ında pg17 aynı donanım üzerinde p99 sorgu gecikmesinde %13, throughput’ta %9 iyileşme veriyor. Major upgrade için logical replication + pg_dumpall hibrit yaklaşımı, downtime’ı 30 dakikanın altına çeker.
Sonuç
PostgreSQL performans optimizasyonu, donanım eklemeden önce uygulanması gereken bir disiplindir. Doğru indeks tercihi (B-tree default, GIN JSONB, BRIN time-series, partial filtreli alt küme), düzenli EXPLAIN ANALYZE alışkanlığı, agresif autovacuum stratejisi (scale_factor 0.02-0.05, maintenance_work_mem 1-2 GB), iş yüküne kalibre edilmiş konfigürasyon (shared_buffers RAM’in %25’i, work_mem 16-128 MB) ve uygun connection pooling (PgBouncer transaction mode) birleşimi, çoğu sistemde p95 latency’yi 2-3x iyileştirir, CPU kullanımını %40-60 düşürür. 2026’da bu temel pratikleri kuran kurumsal ekipler, aylık altyapı maliyetinde %30-46 tasarruf elde ediyor; reaktif değil proaktif kalıyor. Postgres ekosisteminin pg_stat_statements, pgBadger, Datadog DBM, pgAnalyze gibi araçlarıyla haftalık iki saatlik bir izleme döngüsü, yıllık 400-600 saatlik krizi 80-120 saate indirir. Veri tabanını kara kutu olarak görmek yerine periyodik query plan ve bloat raporu üreten ekipler, hem güvenilir hem ölçeklenebilir bir omurga inşa eder; PostgreSQL 17 ile gelen vacuum, streaming I/O ve logical replication yenilikleri bu omurganın gücünü 2026’da bir kat daha artırdı.










Ömer ÖNAL
Mayıs 15, 2026Veri mühendisliği projelerinde sıkça gördüğüm darboğaz: pipeline mimarisine yatırım yapmadan önce veri kalitesi metriklerinin baseline’ı yok. Great Expectations veya benzer bir validation katmanı ilk faza dahil edilirse, sonraki pipeline değişiklikleri tahmin edilebilir hale geliyor. Yorumlarınız ne yönde?