Mimari ve çalışma modeli
B-tree sıralı karşılaştırma yapan eşitlik, aralık, ORDER BY ve prefix desenleri için genel amaçlıdır. GIN, bir satırdaki birden çok anahtarı ters indeksleyerek array, JSONB ve full-text üyelik sorgularını hızlandırır. BRIN fiziksel blok aralıklarının özetini tutar; zaman gibi tablo yerleşimiyle korelasyonu yüksek, çok büyük tablolarda küçük indeksle geniş aralık elemesi yapar.
İndeks seçimi yalnız SELECT süresine göre yapılmaz. Her indeks INSERT/UPDATE/DELETE sırasında bakım, WAL, cache ve vacuum maliyeti ekler. GIN pending list ve fastupdate davranışı yazma gecikmesini toplu bakım anlarına kaydırabilir. BRIN küçük kalır fakat korelasyon bozulduğunda çok sayıda heap page recheck eder. B-tree daha kesin olsa da dev tabloda depolama ve cache baskısı büyür.
Çok sütunlu B-tree'de öndeki sütunlar kullanım etkinliğini belirler. GIN birden çok anahtar alanında farklı davranır; BRIN pages_per_range çözünürlük ile indeks boyutu arasında değiş tokuştur. EXPLAIN (ANALYZE, BUFFERS, WAL) planı, gerçek satır tahminini, heap block okumasını ve yazma etkisini birlikte ölçmek için kullanılmalıdır.
- 1Sorgu ve operatör envanteri
- 2Veri dağılımı/korelasyon ölçümü
- 3Aday indeks ve kontrollü EXPLAIN
- 4Yazma, WAL ve cache doğrulaması
Tasarım parametreleri
- Sorgu operatörü
- Eşitlik/aralık/sıralama, üyelik/containment veya fiziksel aralık elemesini gerçek SQL ile sınıflandırın.
- Korelasyon
- BRIN için sütun değeri ile fiziksel satır sırası korelasyonunu ölçün.
- Yazma oranı
- İndeks sayısı, GIN pending list ve WAL artışını pik ingest altında ölçün.
- Cache bütçesi
- İndeks boyutunu shared buffers ve işletim sistemi cache'iyle birlikte değerlendirin.
Platformlardaki uygulama karşılıkları
Servis adları teknik karşılıklardır. Kapsam, varsayılanlar, bölge kullanılabilirliği ve işletim koşulları farklıdır; birebir aynı garanti anlamına gelmez.
| Ölçüt | B-tree | GIN | BRIN |
|---|---|---|---|
| Tipik kullanım | Eşitlik, aralık, ORDER BY | Array/JSONB/full-text üyelik | Korelasyonlu çok büyük tabloda aralık |
| Boyut | Orta-yüksek | Anahtar yoğunluğuna göre yüksek | Çok küçük |
| Yazma maliyeti | Her satırda dengeli ağaç bakımı | Pending list/anahtar sayısı etkili | Özet aralığı bakımı düşük |
| Yanlış seçim belirtisi | Düşük seçicilikte çok heap erişimi | Containment dışı sorgu veya büyük pending list | Yüksek recheck ve düşük korelasyon |
Hesap ve uygulama örneği
2 TB olay tablosunda created_at fiziksel sırayla 0,98 korelasyonluysa 128 sayfalık BRIN aralıkları küçük indeksle tarih filtresini daraltabilir. Sorgu son 15 dakikayı seçiyorsa BRIN ve B-tree'yi aynı veri snapshot'ında buffers ve p95 süreyle karşılaştırın; yalnız indeks boyutuna bakmayın.
JSONB içinde etiket üyeliği arayan sorgu için GIN adaydır. Saniyede 5.000 insert altında fastupdate açık/kapalı pilotunda p95 insert, WAL MB/s, pending list temizleme süresi ve sorgu p95'i ölçülür. Okuma hızlanırken ingest SLA bozuluyorsa tasarım kabul edilmez.
Örnek komutlar: laboratuvar değerlerini değiştirin; kullanmadan önce yetkiyi ve yazılım sürümünü doğrulayın.
SELECT attname, n_distinct, correlation FROM pg_stats WHERE schemaname='public' AND tablename='events';
EXPLAIN (ANALYZE, BUFFERS, WAL) SELECT * FROM events WHERE created_at >= now()-interval '15 min';
CREATE INDEX CONCURRENTLY events_created_brin ON events USING brin(created_at) WITH (pages_per_range=128);
CREATE INDEX CONCURRENTLY events_tags_gin ON events USING gin(tags jsonb_path_ops);
SELECT relname,pg_size_pretty(pg_relation_size(indexrelid)) FROM pg_stat_user_indexes ORDER BY pg_relation_size(indexrelid) DESC;
Hata teşhisi
| Belirti | Olası neden / ayrım | Doğrulama |
|---|---|---|
| İndeks var ama Seq Scan seçiliyor | Sorgu çok satır seçiyor, istatistik tahmini yanlış veya operatör sınıfı uygun değil olabilir. | ANALYZE sonrası EXPLAIN'de tahmini/gerçek satırları ve operatörü karşılaştırın. |
| GIN yazmaları aralıklı yavaşlıyor | Pending list cleanup veya yoğun anahtar üretimi gecikme oluşturabilir. | `pgstatginindex`, checkpoint/WAL ve p95 ingest zamanını aynı grafikte inceleyin. |
| BRIN çok sayfa yeniden kontrol ediyor | Fiziksel korelasyon düşmüş veya pages_per_range fazla geniş olabilir. | pg_stats correlation, Rows Removed by Index Recheck ve heap block sayılarını ölçün. |
Kabul ve doğrulama kontrolleri
- En yüksek maliyetli sorguları operatör türüne göre sınıflandırın.
- Sütun seçiciliği ve fiziksel korelasyonu ölçün.
- Aday indeks boyutunu üretim ölçeğine projekte edin.
- EXPLAIN ANALYZE BUFFERS ile gerçek heap erişimini kaydedin.
- Pik yazmada p95 latency ve WAL MB/s etkisini ölçün.
- Kullanılmayan veya yinelenen indeksleri kaldırmadan önce tam iş döngüsü gözlemleyin.
İlgili kavramlar
İndeks ve sorgu planı
İndeks, uygun sorgularda taranacak veriyi azaltabilir; her yeni indeks yazma, bakım ve depolama maliyeti getirir. Sütun sırası, seçicilik, filtre ve sıralama gereksinimi birlikte değerlendirilir. Sorgu yavaşlığını yalnız indeks yokluğuna bağlamayın: yanlış tahmin, kilit beklemesi, disk gecikmesi veya gereksiz veri taşıma da neden olabilir. Temsilî sorgunun yürütme planını ve gerçek satır sayılarını inceleyin. Değişikliğin okuma kazancını, yoğun yazma sırasında oluşturduğu maliyetle birlikte ölçün; üretimde kontrolsüz bakım işlemleri başlatmayın.
Gecikme dağılımı
Gecikme, bir işlemin başlangıcı ile yanıtı arasındaki süredir. Ortalama değer, az sayıdaki çok yavaş işlemi gizleyebilir; medyan ile p95/p99 gibi yüzdelikler farklı sorulara cevap verir. Ağ RTT, disk bekleme, işlemci kuyruğu ve uygulama işlemesi toplam süreye katkıda bulunur. Ölçümün istemci tarafında mı sunucuda mı yapıldığını yazın. Gecikme artışının trafik yükselmesine, bakım işine veya kapasite sınırına denk gelip gelmediğini karşılaştırın. Bir eşik seçmeden önce normal yük ve yoğun saat için temel davranışı kaydedin.
Kapasite ve kullanılabilir pay
Ham kapasite ile uygulamanın kullanabileceği kapasite aynı değildir. RAID veya erasure coding, dosya sistemi, ayrılmış alan, metadata, snapshot ve büyüme payı ayrı kalemlerdir. TB ile TiB gösterimi de görünür sayıyı değiştirir. Hesabı birimleriyle yazın ve önce kullanılabilir korumalı kapasiteyi, sonra işletim rezervini çıkarın. Ortalama doluluğu izlemek kadar büyüme eğimini izlemek de önemlidir. Tahmini dolma tarihi, yeni kapasiteyi satın alma ve devreye alma süresinden daha uzakta tutulmalıdır.
Bant genişliği ve gerçek aktarım
Hat kapasitesi ile uygulamanın taşıdığı yararlı veri miktarı farklıdır. Protokol başlıkları, şifreleme, yeniden iletim, küçük dosyalar ve disk beklemeleri net hızı azaltır. Bit ile byte birimini karıştırmayın: 1 Gbit/s teorik olarak 125 MB/s seviyesindedir; bu bir uygulama performans garantisi değildir. Aktarım süresini veri miktarı / ölçülen net hız şeklinde hesaplayın. Ölçümü aynı anda ağ, kaynak okuması ve hedef yazması üzerinden yaparak sınırlayıcı bileşeni bulun. Ortalama hız kadar kısa süreli düşüşleri ve diğer işlerin rekabetini de değerlendirin.
Telemetri ve zaman eşleştirmesi
Telemetri, sistemin ne yaptığını açıklayan log, metrik ve olay kayıtlarının bütünüdür. Log bir olayın ayrıntısını, metrik zaman içindeki davranışı, dağıtık iz ise isteğin bileşenler arasındaki yolunu gösterir. Saat farkları aynı olayı farklı zamanlarda olmuş gibi gösterebilir. Merkezi zaman senkronizasyonu, kaynak kimliği ve tutarlı saat dilimi kullanın. Alarm tasarımında yalnız eşik değil, ne kadar sürdüğü ve kullanıcıya etkisi de değerlendirilmelidir. Kayıtların kesildiği durum ayrıca izlenmeli; günlük kaydı bulunmaması, olay yaşanmadığı şeklinde yorumlanmamalıdır.
Transaction sınırı
Transaction, uygulamanın belirli işlemleri birlikte başarılı veya başarısız kabul ettiği mantıksal birimdir. Veritabanı içindeki atomiklik, e-posta gönderimi veya farklı servislerdeki değişikliklerin otomatik olarak aynı atomik kapsamda olduğu anlamına gelmez. Commit noktası ve hata sonrasında tekrar denemenin davranışı açık olmalıdır. Aynı isteğin iki kez işlenmesini önlemek için idempotency gereksinimini değerlendirin. Testte ağ kesintisi ve bağlantı kopmasını commit öncesi ve sonrasında ayrı uygulayın; istemcinin hata alması işlemin kesinlikle başarısız olduğu anlamına gelmeyebilir.
Birincil teknik dokümantasyon
Doz Teknoloji teknik ekibi tarafından aşağıdaki birincil kaynaklar temel alınarak hazırlanmıştır. Hesaplar ve laboratuvar senaryoları varsayımlarını belirtir; uygulamadan önce kullanılan ürün sürümünü doğrulayın.