27 Eki 2026
Veritabanı optimizasyonu: 876ms → 17ms
Bir aramanın bir saniyeye yakın sürdüğü bir fabrika ölçüm veritabanı. Üç tür değişiklik, her biri tek tek ölçüldü; aynı arama artık 17 ms sürüyor.
Sorun
Bir fabrika ölçüm hattındaki proses kontrol uygulaması raporlarını PostgreSQL’de tutuyor: dört tabloya yazılan 9 milyon ölçüm noktası, rapor başına yaklaşık 84 nokta. Operatörün veri sayfası son 522 bin noktada arıyor. Bir arama altı SQL sorgusu gönderiyor ve filtresiz 681 ms, 30 filtrenin hepsi doluyken 876 ms sürüyordu; bu hızlı bir makinede, orijinal makinede saniyeler. Ölçülen değerler dahil her kolon text’ti, hiçbir tabloda key ya da index yoktu.
Adlar genel, uygulamanın kendi adları değil. Bir çizgi bir kolonu gösterdiği tabloya bağlıyor. Kalan 27 filtre alanı olduğu gibi duruyor.
Ne değiştirdim
- Soruya uyan index’ler: sayfanın sıralaması, farklı parça sayımı, iki açılır liste ve en seçici üç filtre. Bütün filtreler doluyken sayfa 26.301 blok okumaktan 975 bloğa indi.
- Sayı olarak saklanan sayılar: her ölçülen değerin numeric bir kopyası; filtre her satırda text’i regular expression ile sınayıp dönüştürmek yerine sayı karşılaştırıyor.
- Rapor başına tek satırlık tablo: altı sorgudan dördü noktaları değil raporları soruyor; 4.641 satır her birine yaklaşık 1 ms’de cevap veriyor.
Sonuç
Bütün filtreler doluyken 876 yerine 17 ms, filtresiz 681 yerine 6,9 ms: 50 ile 100 kat arası hızlanma. Her değişiklik birkaç saniyelik bir migration’dı; index’ler ve numeric kolonlar 206 MB’lık tablonun yanında 124 MB tutuyor ve uygulamanın orijinal sorguları her adımdan sonra çalışmaya devam etti.