Ana içeriğe geç
Kesit SQL
İleri · SQL Server Operasyon

Önbellek kararı: ne zaman önbelleklenir, bayat veri riski nasıl ölçülür

Okuma ve yazma oranı, tekrar oranı, tazelik gereği ve hassas veri. Isabet oranını günlükten tahmin etmek, bayat okuma riskini saymak.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Senaryo: "Önbellek koyalım"

Sistem yavaş, biri önbellek öneriyor. Önbellek hızlı bir kısayol gibi görünür ama iki soruna yol açar: yanlış veri ve sorunu örtmek. Salı sabahı pahalı sorguyu önbelleğe alsan okuma düşer, ama hatalı sorgu yerinde durur ve önbellek boşaldığı anda yük geri gelir.

Veri kurgudurops_ tabloları hayali bir portal için tohumlu üreteçle kuruldu. Gerçek bir sistemden alınmadı; süre ve okuma değerleri ölçüm değildir. Motor SQLite olduğu için günlükteki SQL Server sorguları çalıştırılmaz, metin olarak incelenir. Tabloları sorgularsın, sistem yönetimi komutlarını yalnız okursun.

Karar soruları

SoruÖnbelleğe uygunUygun değil
Aynı veri tekrar okunuyor mu?Çok tekrarÇoğu istek ıskalıyor: kontrol maliyeti kazancı geçer
Veri ne sıklıkla değişiyor?SeyrekSık yazılıyor
Bayat değerin bedeli ne?Düşük: ürün kategorisi, şube listesiYüksek: hesap bakiyesi, stok, yetki
Hassas mı?HayırGüvenlik verisi kaynaktan okunur
Asıl sorun çözüldü mü?Sorgu zaten iyi, yalnız çok sıkSorgu hatalı: önce onu düzelt

Son iki satır önemli. Mimari rehberi hassas ve güvenlik verisini önbelleğe almamayı, her zaman birincil kaynaktan okumayı önerir. Çoğu isteğin ıskaladığı durumda da önbellek zarar eder.

Hangi önbellek?

KatmanÖrnekKim yönetirNerede anlatıldı
Veritabanı belleğiTampon havuzu, plan önbelleğiMotor, otomatikMimari ve Yürütme planı dersleri
Hesaplanmış sonuçÖzet tablo, materialized view, indexed viewSen, yenileme ileGörünümler ve Toplama dersleri
Uygulama önbelleğiAnahtar-değer deposu, süreç içi bellekUygulamaBu ders

İsabet oranını önceden tahmin et

Önbelleği kurmadan önce günlükten bir tahmin alırsın. Soru: Bir kayıt, kendisinin önceki okumasından en çok N saniye sonra yine okunuyor mu? Öyleyse önbellekten gelebilirdi.

WITH o AS (
  SELECT event_at, LAG(event_at) OVER (PARTITION BY record_id ORDER BY event_at, event_id) AS onceki
  FROM ops_access_log
  WHERE event_type = 'read' AND login_name = 'svc_portal'
)
SELECT COUNT(*) AS okuma,
       SUM(CASE WHEN onceki IS NOT NULL AND (julianday(event_at) - julianday(onceki)) * 86400 <= 60 THEN 1 ELSE 0 END) AS isabet_60sn,
       SUM(CASE WHEN onceki IS NOT NULL AND (julianday(event_at) - julianday(onceki)) * 86400 <= 300 THEN 1 ELSE 0 END) AS isabet_5dk,
       SUM(CASE WHEN onceki IS NOT NULL AND (julianday(event_at) - julianday(onceki)) * 86400 <= 900 THEN 1 ELSE 0 END) AS isabet_15dk
FROM o;

Bu kaba bir tahmindir: Sonsuz kapasite varsayar, önbellekten atılmayı (eviction) hesaba katmaz, süreyi son okumadan sayar (kayan süre). Süreyi uzatmanın ne kazandırdığını görmek için asıl kullanılır: bir noktadan sonra süre uzar, isabet artmaz, yalnız bayat kalma riski büyür.

Bayat veri riski

Yazma olduğunda önbellekteki kopya eskir. Yazmadan sonraki süre içinde gelen okumalar eski değeri görebilir:

SELECT COUNT(*) AS riskli_okuma
FROM ops_access_log w
JOIN ops_access_log r
  ON r.record_id = w.record_id AND r.event_type = 'read'
 AND (julianday(r.event_at) - julianday(w.event_at)) * 86400 BETWEEN 1 AND 300
WHERE w.event_type = 'write';

Bu üst sınırdır: Kayıt yazmadan önce önbellekte olmayabilir. Ölçüm kararı destekler, kararı vermez. Sayı küçük olsa da o veri hesap bakiyesiyse kabul edilemez, ürün açıklamasıysa sorun değildir.

Bayatlığı yönetmek

Karar notuHangi veri, hangi süre, kim siliyor, önbellek düşerse ne olur, bayat veri kimi nasıl etkiler? Beş soruyu yazamıyorsan önbelleği ekleme.
Alıştırmalara geç (7)