▸1. PostgreSQL 17: Neden Yükseltmelisiniz?
PostgreSQL 17, önceki sürümlere kıyasla gösterişli yeni eklentiler yerine çekirdeğin bellek (memory) ve I/O verimliliğine odaklanan devrim niteliğinde bir mühendislik sürümüdür.
#### A. Yeni Nesil VACUUM ve TidStore PostgreSQL 16 ve öncesinde VACUUM süreci, temizlenecek ölü satırların (dead tuple) koordinatlarını (ItemPointerData) düz bir dizi olarak saklardı ve bu durum maintenance_work_mem sınırını hızla doldururdu. PostgreSQL 17 ile birlikte Radix Tree tabanlı yeni bir dahili depolama (TidStore) getirildi.
- •Sonuç: Milyonlarca ölü satırı takip etmek için gereken bellek miktarı %50'den fazla azaldı. İndeks taramalarında bellek yetersizliği nedeniyle diske takılma sorunu minimize edildi.
#### B. Streaming I/O ve Prefetching PostgreSQL 17'de sıralı taramalar (sequential scan) ve bitmap heap taramaları yeni streaming I/O API'si üzerinden çalışır. Disk kontrolcüsüne aynı anda birden fazla blok okuma talebi asenkron olarak iletilir. NVMe SSD sürücülerde bu sayede sorgu bekleme süreleri %20-30 oranında düşmektedir.
▸2. Yükseltme Stratejisi (pg_upgrade --link)
PostgreSQL 15 veya 16'dan 17'ye geçerken disk alanı kopyalamadan hard link yöntemiyle saniyeler içinde geçiş yapılabilir:
# 1. Ön kontrol (Dry-run)
/usr/lib/postgresql/17/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/16/main \
--new-datadir=/var/lib/postgresql/17/main \
--old-bindir=/usr/lib/postgresql/16/bin \
--new-bindir=/usr/lib/postgresql/17/bin \
--check
# 2. Hard-link ile anında yükseltme
/usr/lib/postgresql/17/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/16/main \
--new-datadir=/var/lib/postgresql/17/main \
--old-bindir=/usr/lib/postgresql/16/bin \
--new-bindir=/usr/lib/postgresql/17/bin \
--link