Ders 11 / 12
Bölümleme ve Dosya Düzeni
Bölüm anahtarı seçiminin ve bölüm inceliğinin sorguya ödettiğinin sayılması: dört düzen aynı üç soruya birebir aynı cevabı veriyor (200, 1122 ve 46 satır) ama maliyetleri ayrışıyor. Süzgeç bölüm anahtarının dışına düştüğünde hiçbir dosya budanamıyor ve bölümlemesiz düzenin 4520 maliyeti dönem artı bölge düzeninde 11000'e çıkıyor; farkın tamamı dosya sabitinin elli dört kez fazladan ödenmesidir. Budayan sorguda bile incelik maliyeti 520'den 1000'e ve 1600'e taşıyor, buna karşılık okunan hücre üç düzende de 400'de duruyor: küçük dosya sorunu budur ve maliyetin sabit payı 120'den 600'e ve 1200'e çıkarken hücre payı hiç değişmiyor. Aynı on sorguluk üç ayrı karışımda en ucuz düzen üç ayrı düzen çıkıyor, dolayısıyla anahtar veriye değil sorgu karışımına bakılarak seçiliyor.
İçindekiler
Bir önceki dersin bütün sayıları tek bir dosyanın içinde ölçüldü. Bölüm anahtarı donem
olarak sabit tutuldu, süzgeç hep o anahtarın üstüne düştü ve her sorgu tam olarak bir dosyaya
dokundu. Dosya sabiti bu yüzden hiçbir farkın içine girmedi ve sütunlu okumanın kazancı temiz
göründü. Anahtarın kendisi hiç sorgulanmadı.
Bu ders sabiti kaldırır. İki soru sırayla yanıtlanır: süzgeç bölüm anahtarının dışında bir alana düştüğünde ne oluyor, ve aynı veriyi daha çok dosyaya bölmek — okunan hücre hiç artmasa bile — maliyeti nereye taşıyor. İkinci sorunun yanıtı bu kursun ikinci iddiasının en açık örneğidir.
- AM49. Kaynak, tüketim satırları ve dosya düzeni kurgudur ve ders içinde üretilir. Hiçbir ambar, göl, dosya biçimi ya da sorgu motoru çağrılmaz. Tohum 20260218.
- AM50. Bölümleme (partitioning) satırları bir anahtarın değerine göre ayrı bölümlere dağıtmaktır; bu modelde her bölüm tek bir dosyadır ve iki sözcük eşanlamlı kullanılır. Bölümleme yordamı Veritabanları müfredatındaki İlişkisel Veritabanı Yönetimi kursunda ölçüldü; tekrarlanmaz.
- AM51. Parçalama (sharding) ayrı bir kavramdır ve karıştırılmaz: parçalama satırları kendi depolaması olan bağımsız düğümlere dağıtır. Sistem Tasarımı ve Dağıtık Sistemler müfredatındaki Veri Katmanı Ölçekleme kursunda ölçüldü. Bu derste tek bir depolama vardır; ölçülen şey dosya düzenidir, düğüm dağılımı değil.
- AM52. Bölüm budama (partition pruning): süzgeçteki alan bölüm anahtarındaysa eşleşmeyen dosyalara hiç dokunulmaz. Anahtar dışındaki alan hiçbir dosyayı budamaz ve bütün dosyalar baştan sona okunur.
- AM53. Maliyet, dokunulan dosya ile dosya sabiti 120’nin çarpımına okunan hücrenin eklenmesidir. Sabit bir seçimdir; bu derste ölçülen farkların çoğu doğrudan onun cinsindendir ve her sonuç sabitin değeriyle birlikte yazılır.
- AM54. Sorgu iki sütun okur (
bolgevem3); okuma sütunludur. Sütun seçiminin etkisi bir önceki derste ölçüldü ve burada sabit tutulur. - AM55. Üç soru sabittir: A tek dönemi, B tek tipi, C tek dönemin tek bölgesini ister. Üçünün de doğru cevabı düzenden bağımsızdır.
Bölümleme Anahtarı ve Budama
Aşağıdaki blok hattan çıkan 2200 satırı dört ayrı düzende yazar ve üç soruyu her düzende sorar. Dosya sayısının yanında en küçük ve en büyük dosyanın satır sayısı da basılır.
# KURGUDUR. Olcum aginin sayac okumalari , tuketim satirlari ve dosya duzeni ders # icinde uretilir; hicbir ambar , gol , dosya bicimi ya da sorgu motoru cagrilmaz. TOHUM, M32 = 20260218, 0xFFFFFFFF def uretec(t): x = ((t ^ (t >> 16)) * 2246822507) & M32 x = ((x ^ (x >> 13)) * 3266489909) & M32 s = [(x ^ (x >> 16)) & M32] def sonraki(): s[0] = (s[0] * 1664525 + 1013904223) & M32 return s[0] / 4294967296 return sonraki BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"] TIP = ["mesken", "isyeri"] DONEM = [f"2026-{a:02d}" for a in range(1, 13)] DOSYA_SABIT = 120 # bir dosyaya dokunmanin sabit bedeli , hucre cinsinden ABONE = {} for i in range(200): r = uretec(TOHUM + 37 * i) ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)], "baslangic": 10000 + int(r() * 60000)} def satirlar(): """Hattan cikan tuketim satirlari. Saglam kaynakta ayikla ve tekille asamalari satir dusurmedigi icin tuketim dogrudan kaynaktan , donem farkiyla hesaplanir.""" ham = [] for i, (ab, a) in enumerate(ABONE.items()): e = a["baslangic"] for d in DONEM: r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d)) e += 4 + int(r() * 46) ham.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"], "endeks": e, "birim": "m3"}) tablo, cikti = {(k["abone"], k["donem"]): k for k in ham}, [] for k in ham: i = DONEM.index(k["donem"]) onceki = tablo.get((k["abone"], DONEM[i - 1])) if i else None if onceki is not None: cikti.append(dict(k, m3=k["endeks"] - onceki["endeks"])) return cikti def yaz(kayitlar, bolumleme=()): """Satirlari bolumleme anahtarina gore dosyalara dagitir; her bolum bir dosyadir.""" duzen = {} for k in kayitlar: duzen.setdefault(tuple(k[a] for a in bolumleme), []).append(k) return duzen def sorgu(duzen, bolumleme, secilen, suzgec=None): """Suzgecin bolumleme anahtarindaki alani dosya budar; anahtar disindaki alan hicbir dosyayi budamaz ve dosyanin tamamini okutur.""" suzgec = {} if suzgec is None else suzgec budayan = {a: v for a, v in suzgec.items() if a in bolumleme} kalan = {a: v for a, v in suzgec.items() if a not in bolumleme} dosya, hucre, satir = 0, 0, 0 for anahtar, kayit in duzen.items(): if budayan: es = dict(zip(bolumleme, anahtar)) if any(es[a] != v for a, v in budayan.items()): continue dosya += 1 hucre += len(kayit) * len(secilen) satir += sum(1 for k in kayit if all(k[a] == v for a, v in kalan.items())) return {"dosya": dosya, "hucre": hucre, "satir": satir, "maliyet": dosya * DOSYA_SABIT + hucre} SEC = ("bolge", "m3") DUZENLER = [("bolumlemesiz", ()), ("donem", ("donem",)), ("donem+bolge", ("donem", "bolge")), ("donem+bolge+tip", ("donem", "bolge", "tip"))] SORULAR = [("A donem", {"donem": "2026-07"}), ("B tip", {"tip": "isyeri"}), ("C donem+bolge", {"donem": "2026-07", "bolge": "kuzey"})] TUM = satirlar() print(f"hattan cikan satir {len(TUM)} , secilen sutun {len(SEC)} ," f" dosya sabiti {DOSYA_SABIT} hucre") print("A: donem suzgeci , B: tip suzgeci , C: donem+bolge suzgeci") print("\nduzen dosya kucuk buyuk" + "".join(f"{a[0] + ' dosya/hucre/mal':>21}" for a, _ in SORULAR)) cevap = {} for ad, bl in DUZENLER: d = yaz(TUM, bl) boy = [len(x) for x in d.values()] olcum = [] for sad, f in SORULAR: s = sorgu(d, bl, SEC, f) cevap.setdefault(sad, set()).add(s["satir"]) olcum.append(f"{s['dosya']}/{s['hucre']}/{s['maliyet']}") print(f"{ad:<17} {len(d):>5} {min(boy):>5} {max(boy):>5}" + "".join(f"{x:>21}" for x in olcum)) print("\neslesen satir , dort duzende de: " + " , ".join(f"{a[0]} {sorted(cevap[a])[0]}" for a, _ in SORULAR))
hattan cikan satir 2200 , secilen sutun 2 , dosya sabiti 120 hucre A: donem suzgeci , B: tip suzgeci , C: donem+bolge suzgeci duzen dosya kucuk buyuk A dosya/hucre/mal B dosya/hucre/mal C dosya/hucre/mal bolumlemesiz 1 2200 2200 1/4400/4520 1/4400/4520 1/4400/4520 donem 11 200 200 1/400/520 11/4400/5720 1/400/520 donem+bolge 55 31 49 5/400/1000 55/4400/11000 1/92/212 donem+bolge+tip 110 12 28 10/400/1600 55/2244/8844 2/92/332 eslesen satir , dort duzende de: A 200 , B 1122 , C 46
Son satır bütün tablonun ön koşuludur: dört düzen üç soruya da birebir aynı cevabı veriyor — 200, 1122 ve 46 satır. Ölçülen şey doğruluk değil, aynı cevabın kaça mal olduğudur.
İlk satır tabanı verir. Bölümlemesiz düzende tek bir dosya vardır, her soru onu baştan sona okur ve maliyet üç soruda da 4520’dir. Bu düzen soruya kayıtsızdır; ne ödüllendirir ne cezalandırır.
A sorgusu bölümlemenin vaadidir. donem düzeninde süzgeç anahtarın üstüne düşer, on dosya hiç
açılmaz ve okunan hücre 4400’den 400’e iner; maliyet 4520’den 520’ye düşer. Buraya kadar
bölümleme her ölçüde kazandırır.
B sorgusu vaadin sınırıdır ve bu kursun ikinci iddiasının en açık örneğidir. Süzgeç tip
alanına düşer, tip hiçbir düzenin ilk iki anahtarında yoktur, dolayısıyla budama olmaz ve
bütün dosyalar okunur. Okunan hücre üç düzende de 4400’dür; değişen tek şey dosya sayısıdır:
1, 11 ve 55. Maliyet 4520, 5720 ve 11000 olur. Aynı hücreyi okuyup aynı 1122 satırı
döndüren iki düzen arasındaki 6480’lik fark, dosya sabitinin 54 kez fazladan ödenmesinden
başka bir şey değildir. Bölümleme burada işi kötüleştirmiştir.
Bu satırın başabaş noktası da hesaplanabilir ve şaşırtıcı derecede alçaktır. Budama olmadığında okunan hücre dosya sayısından bağımsız olarak 4400’dür, dolayısıyla maliyet dosya sayısıyla doğrusal büyür ve bölümlemesiz düzenin 4520’sine ancak tek dosyada eşitlenir. Anahtar dışı bir süzgeç için birden çok bölüm her zaman kayıptır; kaybın büyüklüğü değil varlığı bile tartışmaya açık değildir.
Dördüncü satır akla gelen ilk düzeltmedir: tip de anahtara konur. B sorgusu artık budar, dosya
55’e iner ve hücre 2244’e düşer. Buna karşılık maliyet 8844’tür ve hâlâ bölümlemesiz
düzenin neredeyse iki katıdır. Hücrede kazanılan 2156 birim, elli beş dosyanın sabit payı olan
6600 birimi karşılamaz. Bir sorgu için anahtara sütun eklemenin bedeli 110 dosyadır ve o bedel
bütün öbür sorgulara da yansır.
Küçük Dosya Sorunu
İkinci iddianın ikinci örneği budamanın çalıştığı yerde görülür. A sorgusu üç bölümlü düzende de budar; aşağıdaki blok maliyeti iki parçaya ayırır.
# Bu blok ilk bloktaki satirlar() , yaz() , sorgu() , SEC , TUM , DUZENLER ve # SORULAR tanimlarini surdurur. print("A sorgusu (budayan suzgec): maliyetin sabit payi ile hucre payi") print("\nduzen dokunulan dosya sabit payi hucre payi maliyet") for ad, bl in DUZENLER: s = sorgu(yaz(TUM, bl), bl, SEC, {"donem": "2026-07"}) print(f"{ad:<17} {s['dosya']:>15} {s['dosya'] * DOSYA_SABIT:>10}" f" {s['hucre']:>10} {s['maliyet']:>7}") KARISIM = [("A agirlikli", (8, 0, 2)), ("C agirlikli", (2, 0, 8)), ("B agirlikli", (1, 8, 1))] print("\non sorguluk karisimin toplam maliyeti") print("\nkarisim (A,B,C) " + "".join(f"{a:>18}" for a, _ in DUZENLER) + " en ucuz") for kad, agirlik in KARISIM: toplam = [] for ad, bl in DUZENLER: d = yaz(TUM, bl) toplam.append(sum(n * sorgu(d, bl, SEC, f)["maliyet"] for n, (_, f) in zip(agirlik, SORULAR))) print(f"{kad:<17} " + "".join(f"{t:>18}" for t in toplam) + f" {DUZENLER[toplam.index(min(toplam))][0]}")
A sorgusu (budayan suzgec): maliyetin sabit payi ile hucre payi duzen dokunulan dosya sabit payi hucre payi maliyet bolumlemesiz 1 120 4400 4520 donem 1 120 400 520 donem+bolge 5 600 400 1000 donem+bolge+tip 10 1200 400 1600 on sorguluk karisimin toplam maliyeti karisim (A,B,C) bolumlemesiz donem donem+bolge donem+bolge+tip en ucuz A agirlikli 45200 5200 8424 13464 donem C agirlikli 45200 5200 3696 5856 donem+bolge B agirlikli 45200 46800 89212 72684 bolumlemesiz
Üçüncü sütun ilk tablonun okunmayan bulgusudur: hücre payı üç bölümlü düzende de 400’dür. Sorgunun ihtiyaç duyduğu 200 satır ne artar ne azalır; incelen bölümleme onları yalnızca daha çok dosyaya dağıtır. Okunan veri hiç büyümeden maliyet 520’den 1600’e, yani üç katına çıkar ve artışın tamamı sabit payındadır: 120, 600, 1200. Küçük dosya sorunu (small file problem) budur — bir sorgunun okuduğu veri değişmezken, o veriye ulaşmak için açılan dosya sayısının büyümesi.
Sonucun sabite bağlılığı burada açık yazılır. Fark tümüyle dosya sabiti 120 cinsindendir; sabit 60 olsaydı üç düzenin maliyeti 460, 700 ve 1000, sabit 480 olsaydı 880, 2800 ve 5200 olurdu. Sıralama değişmez, çünkü sabit pozitif olduğu sürece daha çok dosya daha pahalıdır; değişen büyüklüktür. “İnce bölümleme pahalıdır” cümlesi sabitin değeri yazılmadan ölçülmüş sayılmaz.
Sabitin neyi temsil ettiği burada söylenmelidir. Bir dosyaya dokunmanın satır sayısından bağımsız bir bedeli vardır: dosyanın yerini bulmak, açmak, başlığını okumak ve hangi sütunun nerede durduğunu çözmek. Bu iş dosya on iki satır da taşısa iki bin iki yüz satır da taşısa aynıdır. Modelin yaptığı tek şey o bedeli hücre cinsinden yazmaktır; 120 sayısı bir ölçüm değil, ölçüyü tek birime indirmek için verilmiş bir karşılıktır.
Bölüm sayısı büyüdükçe dosyalar ayrıca eşitsizleşir. İlk tablonun küçük ve büyük sütunları bunu verir: 55 dosyalı düzende dosyalar 31 ile 49 satır arasında, 110 dosyalı düzende 12 ile 28 satır arasındadır. Aboneler bölgelere eşit dağılmadığı için ortalama 40 ve 20 satır hiçbir dosyayı tarif etmez; sabit bedel ise en küçük dosya için de en büyüğü için de aynıdır. En uçtaki iki dosya bunu açık eder: 110 dosyalı düzende en küçük dosya iki sütunla 24 hücre okutur ve o dosyaya dokunmanın bedelinin beşte dördünden fazlası sabittir; bölümlemesiz düzendeki tek dosya 4400 hücre okutur ve sabitin payı yüzde üçün altında kalır. Bölümlemenin ödettiği şey, sabiti gitgide daha az satıra bölmektir.
Anahtar Bir Sorgu Karışımı İçin Seçilir
İkinci tablo on sorguluk üç ayrı karışımın toplam maliyetini verir ve dersin kararını buraya
taşır. A ağırlıklı karışımda en ucuz düzen donem, C ağırlıklı karışımda donem+bolge,
B ağırlıklı karışımda ise bölümlemesiz düzendir. Üç karışım, üç kazanan.
Ortadaki satır bir öncekinin tersini söyler. C sorgusu hem döneme hem bölgeye süzgeç uyguladığı
için donem+bolge düzeninde tek dosyaya iner ve 92 hücre / 212 maliyet verir; aynı sorgu
donem düzeninde 400 hücre okur. Küçük dosya sorunu bu sorguda yoktur, çünkü incelik sorgunun
süzgeciyle örtüşür. Aynı 55 dosyalı düzen A sorgusunda ceza, C sorgusunda ödüldür.
Son satır en serttir: yalnızca anahtar dışı süzgeç kullanan bir iş yükünde hiç bölümlememek en ucuz karardır — 45200’e karşı 46800, 89212 ve 72684. Bölümleme, sorgusu yazılmadığında ödenen ama karşılığı alınmayan bir bedeldir.
Bu üç satır kursun kuralının tanımıdır. Bir düzenin sayısı sakladığı satır değil, bir sorgunun ona dokunmak için ödediğidir; hangi sorgu için seçildiği yazılmayan düzen ölçülmemiş sayılır. Bir bölüm anahtarı veriye bakılarak seçilemez, çünkü dört düzen de aynı veriyi saklar ve aynı cevabı verir. Seçim yalnızca sorgu karışımına bakılarak yapılır ve karışım değiştiğinde karar yeniden ölçülür.
Özet
- Süzgeçteki alan bölüm anahtarındaysa eşleşmeyen dosyalara hiç dokunulmaz: A sorgusu
bölümlemesiz düzende 4400 hücre okurken
donemdüzeninde 400 okur, maliyet 4520’den 520’ye iner. - Süzgeç anahtarın dışına düştüğünde budama olmaz ve bölümleme işi kötüleştirir: B sorgusunda
okunan hücre üç düzende de 4400 iken maliyet 4520, 5720 ve 11000‘dir; 6480’lik farkın
tamamı dosya sabitinin 54 kez fazladan ödenmesidir. Anahtara
tipeklemek maliyeti 8844’e çeker ama 110 dosya karşılığında. - Budayan sorguda bile incelik ceza yazar: A sorgusunda okunan hücre üç bölümlü düzende de 400’dür, maliyet 520, 1000, 1600 olur ve artışın tamamı sabit payındadır (120, 600, 1200). Küçük dosya sorunu budur.
- Sonuç dosya sabiti 120 cinsindendir: sabit 60’ta üç değer 460/700/1000, 480’de 880/2800/5200 olur. Sıralama sabitin işaretine bağlıdır, büyüklüğü değerine.
- Dört düzen üç soruya da aynı cevabı verir (200, 1122, 46 satır); on sorguluk üç karışımda en
ucuz düzen sırasıyla
donem,donem+bolgeve bölümlemesiz çıkar. Anahtar veriye değil sorgu karışımına bakılarak seçilir.
Sonraki Adım
Bu dersin bütün düzenlerinde on iki dönemin tamamı aynı yerde duruyordu. Hiçbir satır silinmedi, hiçbir dönem başka bir katmana taşınmadı; en eski dönem en yenisiyle aynı bedelle okunabilir durumdaydı. Oysa dosya sabiti her dosya için aynıdır ve dosya sayısı dönemle birlikte büyür. Son ders bu birikimi bir karara çevirir: eski dönemler sıcak katmandan çıkarıldığında sıcak katmanda kaç dosya ve ne kadar maliyet kalıyor, arşivden okumak ne kadara mal oluyor ve geriye dönük olarak hangi soru artık yanıtlanamıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.