Ders 06 / 19
Model Seçim Ölçütleri
Erişim örüntüsünden aileye giden yolun ölçütleri ve her ölçütün bağlandığı sayı: yedi örüntünün hangi ailede ne kadar ucuzladığı ve karşılığında hangi güvenceden vazgeçildiği, aynı beş işin beş ailede puanlanması, ve iş karışımının oranı değiştiğinde kazananın hangi eşikte el değiştirdiği — dolaşma için yüz binde bir, zaman aralığı için beşte bir.
İçindekiler
Beş aile de aynı sırayla ölçüldü ve ortaya bir sıralama değil bir dağılım çıktı. Geriye tek soru kalıyor: eldeki iş için hangi aile. Bu ders o soruyu tercihle değil ölçütle karşılıyor.
Ölçütün işi, elde bulunan bilgiyi — bir uygulamanın hangi sorguları hangi sıklıkla sorduğunu — bir aile adına çevirmektir. Bunun iki koşulu var. Birincisi, her ölçütün bir sayıya bağlı olması: “duruma göre” cümlesi karar taşımaz, “derinlik üçün altında iki model aynı sayıya dokunuyor” cümlesi taşır. İkincisi, ölçütlerin bir karışım üzerinde birlikte çalıştırılması: tek bir sorgu için en ucuz aile ile bütün iş yükü için en ucuz aile aynı olmak zorunda değildir. Ders önce ölçütleri sayılara bağlıyor, sonra beş işi beş ailede puanlayıp karışım oranı değiştiğinde kazananın el değiştirdiği eşiği hesaplıyor.
Beş Ölçüt ve Bağlandıkları Sayı
Erişim örüntüsü en güçlü ölçüttür, ama gücü örüntüye göre değişir. Çizge dersinde birinci ve ikinci derecede iki model aynı sayıya dokundu (22 ve 218); ayrışma üçüncü derecede 1,18 kat, dördüncüde 1,56 kat, beşincide 65,2 kattı. Ölçüt buradan çıkar: ilişki dolaşması bir aile adına işaret etmeye ancak derinlik üçten sonra başlar, ondan öncesi karar taşımaz.
Sorgu yüzeyi genişliği, kaç ayrı alanın süzgeç taşıdığıdır. Tek alan varsa — ve o alan anahtarsa — anahtar sözleşmesi yeter. İkinci alan geldiği anda anahtar–değer dersinin ölçtüğü fark açılır: cezası eşiği aşan 359 üye, deponun kendi dizini varken 1 gidiş ve 5.903 bayt, anahtar taramasıyla 20.000 gidiş ve 11,3 MB istiyor.
Yazma/okuma oranı ölçütü, okuma tarafında kazanılanı yazma tarafında ödenene bölerek çalışır. Anahtar–değer dersi bütünsel değerde 73 baytlık bir eklemenin yazma çarpanını 407’ye çıkardığını, ayrı anahtarda çarpanın 1 kaldığını ölçtü; okuma tarafında ise bütünsel değer 1 gidiş, ayrı anahtar sıralı anahtar uzayında 2, karma anahtar uzayında 66 gidiş istiyor. Başabaş noktası bölmeyle çıkar (hesap): sıralı anahtar uzayında bütünsel değer her 406 okumaya bir yazma oranına kadar kârda, karma anahtar uzayında her 6,2 okumaya bir yazma oranına kadar.
Tutarlılık gereksinimi, dizinin nerede tutulacağını belirler. Uygulamanın kendi tuttuğu ikincil dizin gidişi 20.000’den 360’a indiriyor, ama 243.132 baytlık listeyi her sorguda bütün halinde okutuyor — deponun kendi dizininin okuduğu 5.903 baytın 41,2 katı — ve kayıtla arasında bir tutarsızlık penceresi bırakıyor.
Şema değişim sıklığı ölçütü, denetimin yazma anında mı okuma anında mı yapılacağını sorar. Belge dersi üç şema sürümü yan yana duran bir derlemde dizinden yanıtlanan sorgunun 7.373 kaydı sessizce kaçırdığını ölçtü; savunmalı okuma doğru yanıtı veriyor ama taranan girişi 18.456’dan 50.000’e, yani 2,71 kata çıkarıyor. Şema sık değişiyorsa bu 2,71 kat sürekli ödenen bir maliyettir.
Erişim Örüntüsünden Aileye
Tablonun her satırı bir erişim örüntüsüdür; sayılar beş dersin koşumlarından okundu.
| Erişim örüntüsü | Ucuzlatan aile | Ölçülen fark | Vazgeçilen güvence |
|---|---|---|---|
| Tek anahtarla nokta okuma | anahtar–değer | 1 gidiş, 1 kayıt; ilişkisel tarafta 2 gidiş ve 9 kayıt, tek birleştirmeyle 714 yerine 913 bayt | Alan üzerinde koşul, kısmi güncelleme ve birleştirme sözleşmeden düşer |
| İç içe yapının tümünü okuma | belge | 1 gidiş, 412 bayt; ilişkisel tarafta 4 gidiş ve 513 bayt, tek birleştirmede 60 satır ve 6.718 bayt | Yazma anındaki şema denetimi: üç sürümlü derlemde 7.373 kayıt sessizce kaçırılıyor |
| Geniş satırdan aralık dilimi | geniş sütun | 4.000 sütunluk satırdan bir ayın 333 ödüncü tek istekte; örüntüye uymayan bölüm anahtarıyla 263.867 sütun taranıyor | Bölüm anahtarı tek örüntüye hizmet eder; ikincisini karşılamak girdiyi 527.734’e çıkarır, yazma çarpanı 2,0 |
| İlişki dolaşma (derinlik ≥ 3) | çizge | Beşinci derecede 217.544 kenar; birleştirme 14.190.839 ara satır üretiyor — 65,2 kat | Tek ifadelik bildirimsel sorgu: aynı iş ilişkisel tarafta beş ayrı ifadeye bölünüyor |
| Zaman aralığı taraması | zaman serisi | Bir rafın bir günü tek bölüt ve 1.440 giriş; satır yerleşiminde 17.280 giriş | Erişim birimi ölçüm değil bölüttür: bir saatlik pencere 1.440 giriş çözdürüp 60 ölçüm veriyor |
| Alan altkümesi üzerinde tam tarama | geniş sütun | Dolaşım özeti aile yerleşiminde 46, satır yerleşiminde 1.867 sayfa okuyor — 40,6 kat | Tek kaydın bütün alanları 1 sayfa yerine 4 sayfa; yerleşim iki yönlü çalışıyor |
| İkincil alana göre süzme | belge (deponun kendi dizini) | Eşiği aşan 359 üye 1 gidiş ve 5.903 bayt; anahtar taraması 20.000 gidiş ve 11,3 MB | Dizin bir şema varsayar; sürüm karışıklığında iki dizin birleşimi 2 gidiş, savunmalı tarama 50.000 giriş |
Tablonun okunma yönü tek yönlüdür: soldan sağa. Elde bir aile adı varmış gibi başlanıp ona uyan örüntü aranmaz; elde erişim örüntüsü vardır ve tablo onu bir aileye çevirir. Dördüncü sütun da sonuca dahildir — her satırda kazanılan şeyin bedeli aynı satırda yazılıdır.
Aynı İş Kümesi, Beş Aile
Tablo tek tek örüntüler için karar veriyor. Gerçek bir uygulama ise tek örüntü değil, bir karışım koşturur. Aşağıdaki düzenek kütüphane alanının beş işini beş ailede puanlıyor.
NS30: katalog 50.000 kitap ve 20.000 üye taşır, bir üyenin ödünç geçmişi geniş satırda 4.000 sütundur ve bir ayın dilimi 333 ödünçtür, on iki raf ölçeri 60 saniyede bir yazar. NS31: puanlama birimi “dokunulan birim”dir ve bir sayfa, bir kayıt, bir sütun, bir kenar ve bir bölüt girişi eşit sayılır; bir aile bir örüntünün mekaniğini taşımıyorsa o iş, o ailede alttaki derlemin taranmasıdır. NS32: karışım payları toplamı 1’dir ve maliyet istek başına ağırlıklı ortalamadır.
Yirmi beş hücrenin on sekizi beş dersin koşumlarından okundu (ölçüm), yedisi NS31 kuralıyla dolduruldu (varsayım): nokta okumada belge ve çizge, iç içe okumada anahtar–değer, çizge ve zaman serisi, aralık diliminde belge ve çizge. Ağırlıklı toplamlar ve eşikler hesap sınıfındadır.
// secim/puanlama.mjs — kutuphane alaninin bes isi bes model ailesinde puanlaniyor. Hucreler // bes dersin kosumlarindan okundu; olculmemis hucreler NS31 kuraliyla dolduruldu. Birim // "dokunulan birim"dir (kayit, sayfa, sutun, kenar, giris). Toplam agirlikli ortalamadir, // esik ikili aramayla cozulur; girdi sabittir, cikti kosumdan bagimsizdir. const AILE = ["a-deger", "belge", "g-sutun", "cizge", "z-serisi"]; const IS = [ // [ad, bes ailenin maliyeti] ["nokta okuma", [1, 1, 4, 1, 1440]], // 1 gidis / 4 sayfa / erisim birimi bolut ["ic ice okuma", [1, 1, 4, 22, 1440]], // belge 1 gidis; cizgede birinci derece ["aralik dilimi", [263867, 4000, 333, 4000, 263867]], // bolum anahtari uyuyor: 333 ["dolasma (5. derece)", [14190839, 14190839, 14190839, 217544, 14190839]], ["zaman araligi", [17280, 17280, 17280, 17280, 1440]], // bolut elemesi ]; const KARISIM = [ // paylar bir karisimda 1'e toplanir ["katalog agirlikli", [0.70, 0.29, 0.01, 0, 0]], ["gecmis agirlikli", [0.30, 0.10, 0.58, 0, 0.02]], ["izleme agirlikli", [0.15, 0.05, 0, 0, 0.80]], ]; const toplam = (k) => AILE.map((_, a) => IS.reduce((s, [, n], i) => s + k[i] * n[a], 0)); const enucuz = (t) => AILE.filter((_, a) => t[a] === Math.min(...t)).join("/"); function esik(taban, hedef) { // hedef isin payi p; kalan taban oraninda const kur = (p) => { const k = taban.map((w) => w * (1 - p)); k[hedef] += p; return k; }; const ilk = enucuz(toplam(kur(0))); let a = 0, b = 1; for (let i = 0; i < 200; i += 1) { const p = (a + b) / 2; if (enucuz(toplam(kur(p))) === ilk) a = p; else b = p; } return { pay: (a + b) / 2, once: ilk, sonra: enucuz(toplam(kur(Math.min(1, b * 1.01)))) }; } const satir = (ad, h, ek) => ad.padEnd(22) + h.map((v) => v.padStart(11)).join("") + " " + ek; console.log("matris — is basina dokunulan birim" + `\n${"is".padEnd(22)}${AILE.map((a) => a.padStart(11)).join("")} ${"yayilim".padEnd(12)}en ucuz`); for (const [ad, n] of IS) console.log(satir(ad, n.map(String), `${(Math.max(...n) / Math.min(...n)).toFixed(1) + " kat"}`.padEnd(12) + enucuz(n))); console.log(`\nkarisim — istek basina agirlikli toplam` + `\n${"karisim".padEnd(22)}${AILE.map((a) => a.padStart(11)).join("")} kazanan`); for (const [ad, k] of KARISIM) { const t = toplam(k); console.log(satir(ad, t.map((v) => v.toFixed(2)), enucuz(t))); } console.log("\nesik — katalog karisimina tek bir is eklenince kazanan ne zaman degisiyor"); for (const [ad, i] of [["dolasma (5. derece)", 3], ["zaman araligi", 4]]) { const e = esik(KARISIM[0][1], i); console.log(ad.padEnd(22) + `pay ${(e.pay * 100).toFixed(6).padStart(9)} %` + ` (her ${String(Math.round(1 / e.pay)).padStart(6)} istekte bir)` + ` ${e.once} -> ${e.sonra}`); }
matris — is basina dokunulan birim is a-deger belge g-sutun cizge z-serisi yayilim en ucuz nokta okuma 1 1 4 1 1440 1440.0 kat a-deger/belge/cizge ic ice okuma 1 1 4 22 1440 1440.0 kat a-deger/belge aralik dilimi 263867 4000 333 4000 263867 792.4 kat g-sutun dolasma (5. derece) 14190839 14190839 14190839 217544 14190839 65.2 kat cizge zaman araligi 17280 17280 17280 17280 1440 12.0 kat z-serisi karisim — istek basina agirlikli toplam karisim a-deger belge g-sutun cizge z-serisi kazanan katalog agirlikli 2639.66 40.99 7.29 47.08 4064.27 g-sutun gecmis agirlikli 153388.86 2666.00 540.34 2668.10 153647.66 g-sutun izleme agirlikli 13824.20 13824.20 13824.80 13825.25 1440.00 z-serisi esik — katalog karisimina tek bir is eklenince kazanan ne zaman degisiyor dolasma (5. derece) pay 0.000285 % (her 351177 istekte bir) g-sutun -> cizge zaman araligi pay 20.389929 % (her 5 istekte bir) g-sutun -> z-serisi
Matris satırlarının ilk okunuşu ölçütün gücünü veriyor. Nokta okuma ve iç içe okumada anahtar–değer ile belge berabere: ikisi de 1 birime dokunuyor. Bu iki iş, aralarında seçim yapmak için hiçbir bilgi taşımıyor — karar, okumanın değil yazmanın tarafında, yukarıdaki 406 ve 6,2 sayılarıyla veriliyor. Aynı satırda çizge de 1 birimdedir; ailenin ayırt ediciliği nokta okumada değil, dördüncü satırdadır.
Kazananı Değiştiren Karışım
Karışım tablosu tek örüntü kararının nasıl bozulduğunu gösteriyor. Katalog ağırlıklı karışımda kazanan geniş sütun (7,29 birim); onu belge 40,99 ile izliyor. Geçmiş ağırlıklı karışımda kazanan yine geniş sütun ama arayı 540,34’e karşı 2.666,00 ile açıyor. İzleme ağırlıklı karışımda sıralama tersine dönüyor: zaman serisi 1.440,00 birimle, geniş sütunun 13.824,80’inin dokuz katı altında kalıyor. Üç karışım, iki farklı kazanan.
Eşik satırları asıl kararı taşıyor. Katalog ağırlıklı karışıma beşinci dereceden bir zincir sorusu eklendiğinde kazanan, bu sorunun payı yüzde 0,000285’i geçtiğinde geniş sütundan çizgeye geçiyor — her 351.177 istekte bir. Aynı karışıma zaman aralığı sorgusu eklendiğinde eşik yüzde 20,4, yani her beş istekten biri. İki eşik arasında beş büyüklük mertebesi var.
Bunun nedeni matriste görünüyor: dolaşma satırının en pahalı hücresi 14.190.839, zaman aralığı satırınınki 17.280. Bir işin karışımdaki payı ne kadar küçük olursa olsun, o iş yanlış ailede milyonlarca birime mal oluyorsa toplamı tek başına belirler. Ölçüt şu biçimi alıyor: bir erişim örüntüsünün payı değil, payı ile yanlış ailedeki maliyetinin çarpımı karar verir. Nadir ama çok pahalı bir sorgu, sık ama ucuz bir sorgudan daha belirleyicidir.
Modelin Saymadıkları
Puanlama modeli, sınırları yazılmadan kullanılamaz. Üçü önemli.
Birincisi birim: NS31 bir sayfayı, bir kaydı ve bir bölüt girişini eşit sayıyor, oysa bunlar farklı büyüklüklerdir. Bu yüzden model büyüklük mertebesi farkını taşır, sıralamanın kendisini taşımaz — katalog karışımındaki 7,29’a karşı 40,99 farkı modelin hata payının içindedir, izleme karışımındaki 1.440’a karşı 13.824 farkı değildir.
İkincisi yazma: model yalnız okumayı sayıyor. Geniş sütunun iki karışımda kazanması, bölüm anahtarının tam da o karışımın erişim örüntüsüne göre seçilmiş olmasındandır. Geniş sütun dersi ikinci bir örüntüyü de karşılamanın aynı veriyi ikinci kez yazmak olduğunu, girdinin 263.867’den 527.734’e çıktığını ve yazma çarpanının 2,0 olduğunu ölçtü. Model bu bedeli saymıyor; kazanç orada geri ödeniyor.
Üçüncüsü, matrisin yedi varsayım hücresi ölçülmüş değil kuraldan türetilmiştir. Sonucu değiştiren hücreler ölçüm sınıfındadır (dolaşma satırının tamamı, zaman aralığı satırının tamamı, aralık diliminde geniş sütunun 333’ü), ama bir sonraki adım her zaman aynıdır: karar bir aileye daralınca, o ailenin kendi düzeneğinde ölçüm tekrarlanır.
Özet
- Ölçüt bir sayıya bağlanmadıkça karar taşımaz: dolaşma ancak derinlik üçten sonra aile adına işaret ediyor (1,18 → 1,56 → 65,2 kat), bütünsel değer sıralı anahtar uzayında her 406 okumaya bir yazma oranına kadar kârda kalıyor, şema sürümlerinin yan yana durması doğru yanıtı 2,71 kat pahalılaştırıyor.
- Yedi erişim örüntüsünün her biri bir aileyi işaret ediyor ve her satırda kazanılan şeyin bedeli aynı satırda yazılı: nokta okuma anahtar–değer (alan üzerinde koşul yok), iç içe okuma belge (yazma anında denetim yok), aralık dilimi ve tam tarama geniş sütun (tek bölüm anahtarı, tek örüntü), dolaşma çizge (tek ifadelik sorgu yok), zaman aralığı zaman serisi (erişim birimi bölüt).
- Beş işin puanlanmasında nokta okuma ve iç içe okuma anahtar–değer ile belgeyi berabere bırakıyor (ikisi de 1 birim); bu iki iş aralarında seçim yapmak için bilgi taşımıyor, karar yazma tarafında veriliyor.
- Tek bir örüntü için en ucuz aile ile bütün karışım için en ucuz aile aynı değildir: katalog ve geçmiş ağırlıklı karışımlarda geniş sütun (7,29 ve 540,34), izleme ağırlıklı karışımda zaman serisi (1.440,00) kazanıyor.
- Kazananı payın kendisi değil, payın yanlış ailedeki maliyetle çarpımı belirliyor: dolaşma sorgusu her 351.177 istekte bir sorulduğunda kazanan değişiyor, zaman aralığı sorgusu ise ancak her beş istekten biri olduğunda — iki eşik arasında beş büyüklük mertebesi var.
- Puanlama modeli birimleri eşit saydığı ve yalnız okumayı ölçtüğü için büyüklük mertebesi farkını taşır, sıralamanın kendisini taşımaz; geniş sütunun kazancı, modelin saymadığı 2,0’lık yazma çarpanıyla geri ödenir.
Sonraki Adım
Ölçütler bir aileye işaret ediyor. Karar buraya kadar geldiğinde, örneğin katalog ve ödünç verisinin belge modelinde tutulmasına, sorunun bittiği sanılabilir — oysa yeni başlıyor.
Aile seçmek şema seçmek değildir. Aynı kütüphane alanı belge modelinde birbirinden çok farklı biçimlerde kurulabilir: ödünç kayıtları üye belgesinin içine gömülebilir ya da ayrı bir derlemde referansla tutulabilir, kitabın nüshaları bir dizi olabilir ya da kendi belgeleri, tarih bir metin ya da bir zaman tipi olabilir. Bu dersin puanlama matrisi “belge” sütununu tek bir sayı olarak yazdı; gerçekte o sütun, seçilen şemaya göre kat kat değişen bir aralıktır. Bu aralığın genişliği henüz ölçülmedi. Sonraki konu belge modelinin içine giriyor ve önce en alttan başlıyor: bir belgenin alanları hangi tipleri taşır, bu tipler diskte nasıl gösterilir ve tip seçimi saklanan bayta ne yapar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.