SEN2104 · 12. hafta · Indexing and Query Processing

İndeksleme: dense/sparse indeks, B+ ağacı, hash ve seçim maliyeti

Kayıtlar diskte nasıl durur, indeks aramayı nasıl hızlandırır, B+ ağacına ekleme nasıl yapılır ve bir seçimin maliyeti nasıl hesaplanır.

blockblocking factorheap filesequential filesearch keydense indexsparse indexprimary (clustering) indexsecondary indexmultilevel indexB+ treenode splitstatic hashingbucket overflowextendable hashinglinear scantransfer time t_Tseek time t_S

Şimdiye kadar SQL sorgusunu yazdık ve sonucun ne olacağını konuştuk. Bu hafta soru değişiyor: veritabanı o sonucu ne kadar sürede buluyor? Cevap diskteki düzene ve indekslere bağlı. Sınavda bu konudan üç tip soru gelir: maliyet hesabı (ms cinsinden), B+ ağacına ekleme yapıp son ağacı çizme ve “hangi plan daha ucuz?” karşılaştırması.

Altın kurallar:

  1. Maliyetin birimi disk erişimi. CPU ihmal edilir. Bir blok okumak = transfer (tTt_T), başka bir yere atlamak = seek (tSt_S).
  2. Seek, transferden çok pahalı. Bu sayfada hep tS=4t_S = 4 ms, tT=0.1t_T = 0.1 ms kullanacağız.
  3. İndeks her zaman kazandırmaz. Çok kayıt eşleşiyorsa ikincil indeks, düz taramadan yavaş olabilir.
  4. B+ ağacında yaprak bölünürken anahtar yukarı kopyalanır, iç düğüm bölünürken yukarı taşınır.

Depolama: blok, kayıt, dosya

Disk, veriyi sabit boyutlu bloklar (block) halinde okur ve yazar. Bir kayıt (record) tek başına okunmaz; içinde bulunduğu blok komple belleğe gelir. Bu yüzden önemli sayılar şunlardır:

SembolAnlamı
nrn_rilişkideki kayıt (tuple) sayısı
frf_rblocking factor: bir bloğa sığan kayıt sayısı
brb_rilişkinin kapladığı blok sayısı

fr=⌊blok boyutukayıt boyutu⌋br=⌈nrfr⌉f_r = \left\lfloor \frac{\text{blok boyutu}}{\text{kayıt boyutu}} \right\rfloor \qquad b_r = \left\lceil \frac{n_r}{f_r} \right\rceil

Örnek: blok 4096 bayt, kayıt 200 bayt. fr=⌊20.48⌋=20f_r = \lfloor 20.48 \rfloor = 20. 10000 kayıt varsa br=500b_r = 500 blok.

Dosya düzenleri:

  • Heap file: kayıtlar boş yer neredeyse oraya yazılır, sıra yok. Ekleme ucuz, arama pahalı.
  • Sequential (sorted) file: kayıtlar bir arama anahtarına (search key) göre sıralı. İkili arama ve aralık sorguları mümkün, ama ekleme sırayı korumak için taşma bloklarına ihtiyaç duyar.

İndeks kavramları

İndeks (index), kitabın arkasındaki dizin gibidir: “anahtar değeri → kaydın yeri” çiftleri tutar. İndeksi kurduğumuz öznitelik(ler)e arama anahtarı (search key) denir. Dikkat: arama anahtarı, tablonun birincil anahtarı olmak zorunda değil.

TürTanımNot
Dense indexHer arama anahtarı değeri için bir girdiHer dosyada kurulabilir
Sparse indexSadece bazı değerler için girdi (genelde blok başına bir)Dosya o anahtara göre sıralı olmalı
Primary / clustering indexDosya, indeksin anahtarına göre sıralıTablo başına en fazla bir tane
Secondary indexDosya bu anahtara göre sıralı değilHer zaman dense olmak zorunda

Sparse indekste stu_id = 'S4471' arıyorsan, indekste S4471’den küçük ya da ona eşit en büyük girdiyi bulursun, o bloğa gidip sırayla ilerlersin. Bu sadece dosya sıralıysa çalışır. Secondary indeks sparse olamaz, çünkü kayıtlar dağınıktır ve “bu bloktan sonra devam et” diyemezsin.

Sayılarla: 10000 kayıt, 500 blok, bir indeks bloğuna 100 girdi sığıyor. Dense indeks 10000 girdi, yani 100 blok. Sparse indeks 500 girdi, yani 5 blok. Sparse daha küçük, dense ise bazı sorguları veriye hiç gitmeden cevaplar (örneğin “bu anahtar var mı?”).

Çok seviyeli indeks

İndeks büyüyünce kendisi de diskte aranacak bir dosya olur. Çözüm: indeksin üstüne sparse bir indeks daha kur, en üst seviye tek bloğa sığana kadar devam et. Buna çok seviyeli indeks (multilevel index) denir. Her seviyeden bir blok okunur, sonra veri bloğu. B+ ağacı bu fikrin dengeli ve güncellenebilir halidir.

B+ ağacı

B+ ağacı (B+ tree) veritabanlarının varsayılan indeksidir. Parametresi nn: bir düğümdeki en fazla işaretçi sayısı. Bir düğüm en fazla n−1n - 1 anahtar tutar.

DüğümEn azEn fazla
Yaprak (leaf)⌈(n−1)/2⌉\lceil (n-1)/2 \rceil anahtarn−1n-1 anahtar
İç düğüm (kök hariç)⌈n/2⌉\lceil n/2 \rceil çocuknn çocuk
Kök (yaprak değilse)2 çocuknn çocuk

Özellikler:

  • Bütün yapraklar aynı derinlikte. Ağaç her zaman dengeli.
  • Gerçek kayıt işaretçileri sadece yapraklarda. İç düğümlerdeki anahtarlar sadece yol gösterir.
  • Yapraklar soldan sağa zincirli (son işaretçi bir sonraki yaprağı gösterir). Aralık sorgusunda ilk yaprağı bulup zincir boyunca yürürsün.

Yükseklik sınırı, KK farklı anahtar için:

h≤⌈log⁡⌈n/2⌉K⌉h \le \left\lceil \log_{\lceil n/2 \rceil} K \right\rceil

Gerçek sayılar: 4 KB blok, 32 baytlık anahtar, 8 baytlık işaretçi. (n−1)⋅32+n⋅8≤4096(n-1)\cdot 32 + n \cdot 8 \le 4096 eşitsizliğinden n=103n = 103 çıkar. Kabaca n=100n = 100 alırsak, bir milyon anahtar için h≤⌈log⁡50106⌉=⌈3.53⌉=4h \le \lceil \log_{50} 10^6 \rceil = \lceil 3.53 \rceil = 4. Bir milyon kayıt içinde arama en fazla 4 düğüm okur. İkili aramada bu sayı 20 civarındadır.

Arama: kökten başla. Düğümde aranan değerden büyük ilk anahtarın solundaki işaretçiyi izle; eşit ya da büyükse sağa geç. Yaprağa gelince anahtarı orada ara.

Ekleme ve bölünme (adım adım)

n=4n = 4 (en fazla 3 anahtar). Taşan yaprakta ilk ⌈n/2⌉=2\lceil n/2 \rceil = 2 anahtar solda kalır, gerisi yeni yaprağa gider, yeni yaprağın ilk anahtarı ebeveyne kopyalanır. Taşan iç düğümde ilk ⌈(n+1)/2⌉=3\lceil (n+1)/2 \rceil = 3 işaretçi solda kalır, aradaki anahtar ebeveyne taşınır (alt düğümde kalmaz).

Sırayla 10, 20, 30, 40, 50, 25, 35, 5, 45, 55 ekleyelim. Seviyeler / ile ayrıldı, en sağdaki yapraklar:

ekle 10 -> [10]
ekle 20 -> [10 20]
ekle 30 -> [10 20 30]
ekle 40 -> [30] / [10 20] [30 40]                    yaprak taştı, 30 kopyalandı
ekle 50 -> [30] / [10 20] [30 40 50]
ekle 25 -> [30] / [10 20 25] [30 40 50]
ekle 35 -> [30 40] / [10 20 25] [30 35] [40 50]       sağ yaprak bölündü, 40 yukarı
ekle 5  -> [20 30 40] / [5 10] [20 25] [30 35] [40 50]
ekle 45 -> [20 30 40] / [5 10] [20 25] [30 35] [40 45 50]
ekle 55 -> [40] / [20 30] [50] / [5 10] [20 25] [30 35] [40 45] [50 55]

Son adımı aç: [40 45 50 55] taşar, [40 45] ve [50 55] olur, 50 köke gider. Kök [20 30 40 50] olur, 5 çocuk, n=4n = 4 sınırını aşar. İç düğüm bölünür: solda 3 işaretçi ([20 30]), 40 yeni köke taşınır, sağda [50]. Ağaç bir seviye uzadı. B+ ağacı aşağı doğru değil, yukarı doğru büyür. Bu yüzden yapraklar hep aynı derinlikte kalır.

TUZAK · 40 nerede? Son ağaçta 40 hem kökte hem yaprakta [40 45] var. Bu doğru: yaprak bölünmesinde kopyalanan değer yaprakta da durur. Ama iç düğüm bölünmesinde yukarı çıkan 40, ikinci seviyede tekrar yazılmaz. [20 30 40] / [50] yazan puan kaybeder.

Silme (kısaca)

Silmede yaprak minimum doluluğun altına düşerse önce kardeşten ödünç alınır (redistribution), olmuyorsa kardeşle birleştirilir (merge/coalesce) ve ebeveynden bir anahtar silinir. Birleşme köke kadar yayılabilir; kökün tek çocuğu kalırsa kök silinir ve ağaç bir seviye kısalır.

Hash ile indeksleme

Statik hash (static hashing): mm kova (bucket) ve bir hash fonksiyonu hh. Kayıt h(k)h(k) numaralı kovaya yazılır. Eşitlik araması tek kova okur; aralık sorgusu için hash işe yaramaz çünkü komşu değerler dağılır.

h(k)=k mod 4h(k) = k \bmod 4 ile 12, 7, 21, 30, 16, 9, 43:

KovaAnahtarlar
012, 16
121, 9
230
37, 43

Kova dolarsa taşma bloğu (overflow bucket) zincirlenir. Zincir uzadıkça arama yavaşlar. Veri büyüdükçe mm sabit kaldığı için statik hash bozulur.

Extendable hashing bu sorunu çözer: hash değerinin ilk ii bitine bakan bir dizin (directory) tutar. Bir kova taşınca sadece o kova ikiye bölünür; gerekirse dizin boyutu ikiye katlanır (ii bir artar). Bütün dosyayı yeniden hash’lemek gerekmez.

Seçim (selection) maliyetleri

σA=v(r)\sigma_{A = v}(r) ya da σA≥v(r)\sigma_{A \ge v}(r) için kullanılan yöntemler. Kitabın baskısına göre A1, A2 numaraları değişir; sınavda yöntemin adını ve formülünü bilmen yeter. hih_i: B+ ağacının yüksekliği. Örneklerde br=500b_r = 500, hi=3h_i = 3.

YöntemMaliyetÖrnek
Lineer tarama (linear scan)tS+brtTt_S + b_r t_T4+50=544 + 50 = 54 ms
Lineer, anahtarda eşitlik (ortalama)tS+(br/2)tTt_S + (b_r/2) t_T4+25=294 + 25 = 29 ms
İkili arama, dosya anahtara göre sıralı⌈log⁡2br⌉(tT+tS)\lceil \log_2 b_r \rceil (t_T + t_S)9⋅4.1=36.99 \cdot 4.1 = 36.9 ms
Birincil B+ indeks, anahtarda eşitlik(hi+1)(tT+tS)(h_i + 1)(t_T + t_S)4⋅4.1=16.44 \cdot 4.1 = 16.4 ms
Birincil indeks, anahtar olmayan eşitlik (bb blok)hi(tT+tS)+tS+b tTh_i (t_T + t_S) + t_S + b\, t_Tb=5b = 5: 16.816.8 ms
İkincil indeks, nn eşleşen kayıt(hi+n)(tT+tS)(h_i + n)(t_T + t_S)n=40n = 40: 176.3176.3 ms
Birincil indeks, aralık (bb blok)hi(tT+tS)+tS+b tTh_i (t_T + t_S) + t_S + b\, t_Tb=50b = 50: 21.321.3 ms

Mantık hep aynı: indeks ağacında her seviye rastgele bir okuma (seek + transfer). Birincil indekste veri sıralı olduğu için eşleşen kayıtlar ardışık bloklarda: bir seek, sonra bb transfer. İkincil indekste her eşleşen kayıt başka bir yerde olabilir, her biri ayrı seek ister.

TUZAK · ikincil indeks + çok eşleşme. 40 eşleşme ile ikincil indeks 176.3 ms, düz tarama 54 ms. Eşleşen kayıt sayısı arttıkça ikincil indeks hızla pahalanır. “İndeks varsa her zaman indeks kullanılır” cevabı yanlış.

Gerçek bir sistemde bunu görmek için örnek veritabanımızda (takes tablosu) SQLite’ın planına bakalım:

EXPLAIN QUERY PLAN SELECT * FROM takes WHERE course_id = 'MA101';
CREATE INDEX idx_takes_course ON takes(course_id);
EXPLAIN QUERY PLAN SELECT * FROM takes WHERE course_id = 'MA101';
SCAN takes
SEARCH takes USING INDEX idx_takes_course (course_id=?)

İndeks yokken tablo baştan sona taranıyor (SCAN). İndeksten sonra B+ ağacında arama yapılıyor (SEARCH). Sonuç iki durumda da aynı üç satır: S1, S3, S4. İndeks sonucu değil, yolu değiştirir.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
frf_r yukarı yuvarlanırAşağı yuvarlanır (yarım kayıt sığmaz); brb_r yukarı yuvarlanır
Secondary index sparse olabilirOlamaz, dosya o anahtara göre sıralı değil, hep dense
Bir tabloda birden çok clustering indexDosya tek bir düzende sıralanabilir, en fazla bir tane
nn = düğümdeki anahtar sayısınn işaretçi sayısı; anahtar en fazla n−1n-1
İç düğüm bölünmesinde ortadaki anahtar iki yerde kalırİç düğümde yukarı taşınır, sadece yaprak bölünmesinde kopyalanır
B+ ağacı yapraklardan aşağı büyürKök bölünür, ağaç yukarı büyür; yapraklar hep aynı derinlikte
İkili aramada sadece transfer sayılırHer adım farklı bloğa atlar: ⌈log⁡2br⌉(tT+tS)\lceil \log_2 b_r \rceil (t_T + t_S)
İndeks varsa her zaman daha hızlıÇok eşleşen ikincil indeks, (hi+n)(tT+tS)(h_i+n)(t_T+t_S), taramadan yavaş olabilir
Hash aralık sorgusunu hızlandırırSadece eşitlik; aralık için B+ ağacı

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

A disk block holds 4096 bytes and each fixed-length record is 120 bytes (records do not span blocks). A relation has 17000 records. Compute the blocking factor frf_r and the number of blocks brb_r.

Cevabı göster
f_r = 34, b_r = 500

fr=⌊4096/120⌋=⌊34.13⌋=34f_r = \lfloor 4096 / 120 \rfloor = \lfloor 34.13 \rfloor = 34 kayıt/blok. Kayıt bloklar arasında bölünmediği için aşağı yuvarlanır.br=⌈17000/34⌉=500b_r = \lceil 17000 / 34 \rceil = 500 blok. Blok sayısında yukarı yuvarlanır, yarım blok da bir bloktur.

Soru 2kolay

A file sorted on stu_id has 30000 records, 30 records per block. How many entries does a sparse primary index on stu_id have (one entry per block)? How many does a dense index have?

Cevabı göster
sparse: 1000, dense: 30000

Blok sayısı 30000/30=100030000 / 30 = 1000. Sparse indeks her blok için bir girdi tutar: 1000 girdi.
Dense indeks her arama anahtarı değeri için girdi tutar. stu_id anahtar olduğu için her kayıt ayrı değer: 30000 girdi.

Soru 3orta

A heap file has br=800b_r = 800 blocks. With tS=4t_S = 4 ms and tT=0.1t_T = 0.1 ms, what is the cost of a linear scan for salary > 50000? What is the average cost for an equality condition on a key attribute?

Cevabı göster
84 ms; 44 ms

Koşul anahtar üzerinde değilse dosyanın tamamı okunur: tS+br⋅tT=4+800⋅0.1=84t_S + b_r \cdot t_T = 4 + 800 \cdot 0.1 = 84 ms.
Anahtar üzerinde eşitlikte ilk eşleşmede durulur; ortalama yarısı okunur: tS+(br/2)⋅tT=4+400⋅0.1=44t_S + (b_r/2) \cdot t_T = 4 + 400 \cdot 0.1 = 44 ms.

Soru 4orta

A file is sorted on the key course_id and has 1000 blocks, no index. Estimate the cost of course_id = 'CS305' using binary search (tS=4t_S = 4 ms, tT=0.1t_T = 0.1 ms).

Cevabı göster
41 ms

İkili arama ⌈log⁡21000⌉=10\lceil \log_2 1000 \rceil = 10 blok okur (210=1024≥10002^{10} = 1024 \ge 1000).
Her okuma rastgele bir yere gider, yani her blok bir seek + bir transfer: 10⋅(4+0.1)=4110 \cdot (4 + 0.1) = 41 ms.

Soru 5orta

In a B+ tree with n=5n = 5 (at most 5 pointers per node), what are the minimum and maximum number of keys in a leaf, and the minimum and maximum number of children of a non-root internal node?

Cevabı göster
leaf: 2-4 keys; internal: 3-5 children

Düğümde en fazla n−1=4n-1 = 4 anahtar var.
Yaprak en az ⌈(n−1)/2⌉=⌈2⌉=2\lceil (n-1)/2 \rceil = \lceil 2 \rceil = 2 anahtar tutar, en fazla 4.
Kök olmayan iç düğüm en az ⌈n/2⌉=⌈2.5⌉=3\lceil n/2 \rceil = \lceil 2.5 \rceil = 3 çocuk, en fazla 5 çocuk tutar.
Kök istisna: yaprak değilse en az 2 çocuk yeter.

Soru 6zor

Insert the keys 8, 5, 1, 7, 3 (in this order) into an empty B+ tree with n=3n = 3 (at most 2 keys per node). When a node overflows, the left node keeps ⌈n/2⌉\lceil n/2 \rceil keys (leaf) or ⌈(n+1)/2⌉\lceil (n+1)/2 \rceil pointers (internal). Give the final tree level by level.

Cevabı göster
[7] / [5] [8] / [1 3] [5] [7] [8]

8, 5: tek yaprak [5 8].
1: [1 5 8] taşar. Solda 2 anahtar [1 5], sağda [8]. Sağın ilk anahtarı 8 yukarı: kök [8].
7: 7 < 8 olduğu için sol yaprağa: [1 5 7] taşar, [1 5] ve [7] olur, 7 köke çıkar: kök [7 8], 3 çocuk (sınır 3, sorun yok).
3: [1 3 5] taşar, [1 3] ve [5], 5 yukarı: kök [5 7 8] olur, 4 çocuk, taşar.
İç düğüm bölünmesi: solda ⌈4/2⌉=2\lceil 4/2 \rceil = 2 işaretçi [5], ortadaki 7 yukarı çıkar (iç düğümde yukarı çıkan anahtar alt düğümde kalmaz), sağda [8].
Sonuç: kök [7], ikinci seviye [5] [8], yapraklar [1 3] [5] [7] [8]. Yükseklik 3.

Soru 7orta

A B+ tree has n=50n = 50 and indexes K=100000K = 100000 search-key values. Give an upper bound on its height (number of levels from root to leaf).

Cevabı göster
4

En kötü durumda her düğüm yarı dolu: dallanma ⌈n/2⌉=25\lceil n/2 \rceil = 25.
Yükseklik ≤⌈log⁡25100000⌉\le \lceil \log_{25} 100000 \rceil. log⁡25100000=5log⁡1025≈3.58\log_{25} 100000 = \frac{5}{\log_{10} 25} \approx 3.58, yukarı yuvarlayınca 4.
Yani bir anahtarı bulmak için en fazla 4 düğüm okunur.

Soru 8orta

A primary B+ tree index on the key inst_id has height hi=4h_i = 4. What is the cost of inst_id = 'I3' (tS=4t_S = 4 ms, tT=0.1t_T = 0.1 ms)?

Cevabı göster
20.5 ms

Kökten yaprağa hih_i düğüm, sonra kaydın bulunduğu 1 veri bloğu. Her biri rastgele erişim (seek + transfer).(hi+1)(tT+tS)=5⋅4.1=20.5(h_i + 1)(t_T + t_S) = 5 \cdot 4.1 = 20.5 ms.

Soru 9zor

A relation has 500 blocks. A secondary B+ tree index on the non-key attribute dept_name has hi=3h_i = 3, and 200 records satisfy dept_name = 'CS', each in a different block. Compare the index plan with a linear scan (tS=4t_S = 4 ms, tT=0.1t_T = 0.1 ms). Which is cheaper?

Cevabı göster
index 832.3 ms vs scan 54 ms: linear scan

İkincil indekste her eşleşen kayıt ayrı bir blokta olabilir: (hi+n)(tT+tS)=(3+200)⋅4.1=832.3(h_i + n)(t_T + t_S) = (3 + 200) \cdot 4.1 = 832.3 ms.
Lineer tarama: tS+brtT=4+500⋅0.1=54t_S + b_r t_T = 4 + 500 \cdot 0.1 = 54 ms. Tek seek, sonra ardışık okuma.
Çok kayıt eşleşiyorsa ikincil indeks taramadan pahalıdır. Optimizer bu yüzden indeksi her zaman kullanmaz.

Soru 10kolay

Static hashing with 5 buckets and h(k)=k mod 5h(k) = k \bmod 5. Insert 23, 8, 15, 42, 31, 10. Which keys go to each bucket 0-4?

Cevabı göster
0: 15 10 | 1: 31 | 2: 42 | 3: 23 8 | 4: empty

23 mod 5 = 3, 8 mod 5 = 3, 15 mod 5 = 0, 42 mod 5 = 2, 31 mod 5 = 1, 10 mod 5 = 0.
Kova 0: 15, 10. Kova 1: 31. Kova 2: 42. Kova 3: 23, 8. Kova 4 boş.
Kova kapasitesi 1 olsaydı 0 ve 3 numaralı kovalar taşardı (bucket overflow).

Soru 11zor

A dense index has 20000 entries and 100 index entries fit in one block. You build a multilevel index until the top level fits in one block. How many index levels are there, and how many block reads does a lookup need (including the data block)?

Cevabı göster
3 levels; 4 block reads

En alt seviye: ⌈20000/100⌉=200\lceil 20000/100 \rceil = 200 blok.
Onun üstü: ⌈200/100⌉=2\lceil 200/100 \rceil = 2 blok. Onun üstü: ⌈2/100⌉=1\lceil 2/100 \rceil = 1 blok. Burada durulur.
3 indeks seviyesi, her seviyeden 1 blok okunur, sonra veri bloğu: 4 okuma.

Soru 12orta

A file is sorted on tot_cred and has a primary B+ tree index on it with hi=3h_i = 3. The query tot_cred >= 100 returns records stored in 40 consecutive blocks. Estimate the cost (tS=4t_S = 4 ms, tT=0.1t_T = 0.1 ms).

Cevabı göster
20.3 ms

İndeksle ilk uygun kayda in: hi(tT+tS)=3⋅4.1=12.3h_i (t_T + t_S) = 3 \cdot 4.1 = 12.3 ms.
Dosya bu öznitelikte sıralı olduğu için kalan kayıtlar ardışık bloklarda: bir seek ve 40 transfer, tS+b⋅tT=4+4=8t_S + b \cdot t_T = 4 + 4 = 8 ms.
Toplam 12.3+8=20.312.3 + 8 = 20.3 ms.

Doğrulama: B+ ağacı ekleme algoritması (yaprak ve iç düğüm bölünmesi) JS ile yazıldı, her ekleme sonrası ağaç basıldı; blocking factor, indeks seviye sayıları, hash kovaları ve tüm seçim maliyetleri node ile hesaplandı; indeksli/indekssiz sorgu planı node:sqlite EXPLAIN QUERY PLAN ile gösterildi (verify/SEN2104/12.mjs).

Deftere not kartı

f_r = floor(blok / kayıt) b_r = ceil(n_r / f_r) dense: her anahtar değeri için girdi sparse: her blok için (dosya sıralı olmalı) primary/clustering: dosya o anahtara göre sıralı secondary: sıralı değil, hep dense B+ (n işaretçi): yaprak ceil((n-1)/2)..n-1 anahtar, iç düğüm ceil(n/2)..n çocuk yükseklik <= ceil(log_{ceil(n/2)} K) yapraklar zincirli, aralık sorgusu kolay yaprak bölünmesi: sağın ilk anahtarı KOPYALANIR yukarı iç bölünme: ortadaki TAŞINIR lineer: t_S + b_r t_T anahtarda eşitlik ort: t_S + (b_r/2) t_T ikili arama (sıralı dosya): ceil(log2 b_r)(t_T + t_S) birincil indeks, anahtar eşitliği: (h_i + 1)(t_T + t_S) birincil, anahtar olmayan / aralık: h_i(t_T + t_S) + t_S + b t_T ikincil, n eşleşme: (h_i + n)(t_T + t_S) → n büyükse taramadan pahalı hash: h(k) = k mod m, taşma zinciri; extendable hashing dizini ikiye katlar