---
title: 'Bölümleme ve Dosya Düzeni'
source: 'https://academia.sh/tr/kurslar/veri-depolama-mimarileri/bolumleme-ve-dosya-duzeni'
course: 'Veri Depolama Mimarileri'
language: tr
updated: '2026-08-17T18:08:50+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

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 (`bolge` ve `m3`); 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.

```python
# 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.

```python
# 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 `donem` dü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 `tip` eklemek 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`+`bolge` ve 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**.
