Görünümler (Views)
Üç şema seviyesi · Sanal tablo · Materialized view · Controlled redundancy
Üç Şema Seviyesi
Veritabanları üç seviyede yapılandırılır. Üstten alta: Dış Şema (External), Kavramsal Şema (Conceptual) ve Fiziksel Şema (Physical).
Dış Şema (External)
Kullanıcıya veya uygulamaya özel tablolar. Örn: STUDENT_INFO, CLASS_LIST. Görünümler (Views) bu seviyededir.
Kavramsal Şema (Conceptual)
Kullanıcıdan bağımsız, gerçek tablo tanımları. Örn: STUDENT, ENROLL, SECTION.
Fiziksel Şema (Physical)
Disk üzerindeki gerçek dosyalar ve indeksler. Örn: student.dat, gradyear.idx. İndeksler bu seviyededir.
Görünümler → Dış Şema seviyesinde yaşar & Fiziksel detayları gizler. İndeksler → Fiziksel Şema seviyesinde yaşar & sorgu performansını artırır.
View (Görünüm) Nedir?
Bir view (görünüm), esasen isim verilmiş bir SQL sorgusudur. Gerçek veri depolamaz; sorgu çalıştığında temel tablolardan veri türetir.
Veri Gizleme
Bazı sütunları (örn: maaş) belirli kullanıcılardan gizler. Güvenlik katmanı sağlar.
Sorgu Kolaylığı
Karmaşık join sorgularını basit bir view adıyla özetler. Tekrar kullanılabilir.
Modülerlik
Farklı departmanlar kendi view'larını kullanır; altta yatan tablo değişse bile view arayüzü sabit kalır.
View'lar sanal tablodur — disk üzerinde data saklamaz, yalnızca sorgu tanımını saklar. İçindeki query her erişimde çalışır.
View'ı SQL ile Oluşturma & Kullanma
Temel sözdizimi:
CREATE VIEW view_adi AS SELECT sutun1, sutun2 FROM tablo_adi WHERE kosul;
Örnek 1 — Tek tablo view: Yalnızca CLERK (katip) olan çalışanların adı ve maaşını göster.
CREATE VIEW Clerk AS SELECT ename, sal FROM emp WHERE job = 'CLERK';
Bu view'ı tabloymuş gibi sorgulayabiliriz:
SELECT ename FROM Clerk WHERE sal > 1000; -- Şuna eşdeğerdir: SELECT ename FROM emp WHERE job = 'CLERK' AND sal > 1000;
Örnek 2 — Çok tablo (join) view:
CREATE VIEW EmpDepartments AS SELECT emp.ename, dept.deptno, dept.dname FROM emp, dept WHERE emp.deptno = dept.deptno; -- Kullanımı: SELECT ename FROM EmpDepartments WHERE dname = 'RESEARCH';
Örnek 3 — Sütun yeniden adlandırma:
CREATE VIEW Clerk (clerkName, clerkSalary) AS SELECT ename, sal FROM emp WHERE job = 'CLERK';
View bir sorguyu depolayan yapıdır, veriyi değil. Her sorgulama, view'ın tanımındaki SELECT yeniden çalıştırılır ve güncel sonuç döner.
View'ları Güncelleme (INSERT / UPDATE / DELETE / DROP)
Bir view'ın güncellenebilir (updatable) olması için her view satırının, alttaki tabloda birebir karşılığı olması gerekir.
✅ Güncellenebilir
- Tek tablodan oluşan view
- Aggregation (SUM, COUNT…) yok
- DISTINCT yok
- GROUP BY / HAVING yok
❌ Güncellenemez
- Aggregate fonksiyon içerir
- DISTINCT kullanır
- GROUP BY / HAVING içerir
- Çok tablo join'i (genelde)
INSERT örneği — View üzerinden kayıt eklemek için NOT NULL olan sütunlar da SELECT listesinde olmalı:
CREATE VIEW Clerk AS SELECT empno, ename, job, sal FROM emp WHERE job = 'CLERK'; INSERT INTO Clerk VALUES (1234, 'SUE', 'CLERK', 8000); -- emp tablosuna yansır: empno=1234, ename=SUE, job=CLERK, sal=8000, diğerleri NULL
DELETE örneği:
DELETE FROM Clerk WHERE ename LIKE '%MS%'; -- Arka planda çevrilir: DELETE FROM emp WHERE ename LIKE '%MS%' AND job = 'CLERK';
UPDATE örneği:
UPDATE Clerk SET sal = 1000 WHERE ename = 'JAMES'; -- Arka planda: UPDATE emp SET sal = 1000 WHERE ename = 'JAMES' AND job = 'CLERK';
Sadece okunabilir (read-only) view:
CREATE VIEW Manager AS SELECT empno, ename, sal FROM emp WHERE job = 'MANAGER' WITH READ ONLY; -- DELETE / INSERT / UPDATE → ORA-42399 hatası verir
DROP VIEW:
DROP VIEW Clerk; -- Sadece view tanımını siler, emp tablosunu silmez. -- DROP TABLE emp ise hem tabloyu siler hem Clerk view'ını işlevsiz kılar.
StudentMajor gibi iki tablodan JOIN ile oluşan bir view'da, "Sue'yu sil" komutu verildiğinde sistem kimi sileceğini bilemez: Sue'nun öğrenci kaydını mı, Math departman kaydını mı, yoksa yalnızca major bağlantısını mı? Bu belirsizlik nedeniyle çok tablolu view'lar genelde güncellenemez.
Materialized View & Kontrollü Artıklık
Normal view gerçek veri saklamaz. Materialized (somutlaştırılmış) view ise view sorgusunun sonucunu disk üzerinde gerçek bir tablo olarak depolar.
View (Sanal)
- Disk'te yalnızca sorgu tanımı saklanır
- Her sorguda yeniden hesaplanır
- Her zaman güncel veri döner
- Ek disk alanı gerekmez
Materialized View
- Disk'te gerçek veri saklanır
- Sorgu çok hızlı (hesaplama yok)
- Alttaki tablo değişince güncellenmeli
- Ek disk alanı kullanır
Kontrollü Artıklık (Controlled Redundancy): İyi tasarlanmış veritabanında artık veri istenilmez (tutarsızlık riski). Ancak sorgu performansı için artıklık faydalı olabilir. Materialized view, bu artıklığı sistem tarafından tutarlı tutan bir mekanizmadır.
Örnek: ENROLL tablosunda CourseId yoksa, "F notu verilen kursları bul" için SECTION tablosunu da join etmek gerekir:
-- CourseId ENROLL'da olmadan: SELECT c.Title FROM COURSE c, SECTION k, ENROLL e WHERE c.CId=k.CourseId AND k.SectId=e.SectionId AND e.Grade='F'; -- CourseId ENROLL'a eklendikten (materialized view) sonra: SELECT c.Title FROM COURSE c, ENROLL e WHERE c.CId=e.CourseId AND e.Grade='F';
Materialized view oluşturma (Oracle):
CREATE MATERIALIZED VIEW ENROLL_PLUS_CID AS SELECT e.*, k.CourseId FROM ENROLL e, SECTION k WHERE e.SectionId = k.SectId; -- Güncelleme frekansı gibi parametreler de ayarlanabilir
Fayda > Maliyet olduğunda. Sık erişilip, hesaplaması pahalıysa değerlidir. Sık güncellenen ve büyük çıktı üreten view'lar için maliyetlidir. Hangi view'ların somutlaştırılacağına veritabanı tasarımcısı karar verir.
Veritabanı sistemi bir sorgu optimizörüne sahiptir. Bu optimizör, sorguda açıkça belirtilmemiş materialized view'ları bile fark edip kullanabilir. Karar kullanıcıya değil, optimizöre aittir.
İndeksler (Indexes)
Disk maliyeti · Heap file · Dense/Sparse · B⁺-Tree · Hash · Composite · DROP INDEX
Bellek Hiyerarşisi & Disk Maliyeti
Her veritabanı sorgusu, veriyi diskten RAM'e taşımak zorundadır. Katmanlar arasındaki hız farkı çok büyüktür — işte bu yüzden indeksler kritiktir.
Disk erişim süresi üç bileşenden oluşur:
Arama Süresi (Seek Time) — 9.1 ms
Okuma/yazma kolunun doğru pistine fiziksel olarak hareket etmesi. En iyi: ~1 ms, en kötü: ~18 ms, ortalama: 9.1 ms.
Dönme Gecikmesi (Rotational Delay) — 4.17 ms
Plaka, hedef sektör okuyucunun altına gelene kadar döner. 7200 RPM → tam tur = 8.33 ms → ortalama bekleme = 4.17 ms.
Transfer Süresi (Transfer Time) — 0.3 ms
Verinin manyetik yüzeyden okunması. 13 MB/s transfer → 4 KB sayfa → 0.3 ms.
Veritabanı sistemlerinde maliyet = disk sayfa erişimi sayısı. CPU adımı veya satır sayısı değil. 1.000.000 satırlık tablo, 50.000 sayfada → indekssiz tam tarama = 680 saniye. B⁺-Tree ile sadece ~4 sayfa okuma = 0.054 saniye.
İki temel sorgu türü:
-- Nokta Sorgusu (Exact Match / Point Query): SELECT * FROM book WHERE title = 'Database'; -- tek sonuç beklenir -- Aralık Sorgusu (Range Query): SELECT * FROM book WHERE year BETWEEN 2003 AND 2005; -- çok sonuç
Heap File — En Basit Dosya Organizasyonu
Bir dosya (file), mantıksal veri koleksiyonunun disk sayfaları kümesi olarak fiziksel depolanmasıdır. En basit organizasyon: Heap File — sayfalar bağlı liste şeklinde, kayıtlar sırasız.
Ekleme (INSERT)
Boş yer olan herhangi bir sayfaya ekle. Çok hızlı — O(1) sayfa erişimi.
Silme (DELETE)
Kaydı silinmiş olarak işaretle. Alan hemen geri kazanılmayabilir.
Arama (SEARCH)
Tüm sayfaları tara, kayıt bulunana kadar devam et. Çok yavaş — O(N sayfa)!
Her sorguda sıralı tarama yapmak büyük tablolarda son derece pahalıdır. Çözüm: İndeks — veritabanına tam olarak nereye bakması gerektiğini söyleyen ayrı bir yapı.
İndeks Kavramı & Temel Terimler
İndeks, veriyi hızlı bulmaya yarayan veri yapısıdır. Kütüphane kataloğu analojisi: kitaplar raf sırasına göre (= heap file), yazar kataloğu ise indeks görevi görür.
Her kayıt şöyle görünür: [arama-anahtarı | işaretçi]. İndeks dosyası genellikle orijinal tablodan çok daha küçüktür.
İndeks Anahtarı (Index Key)
İndeksin üzerine inşa edildiği sütun. CREATE INDEX komutuyla belirlenir, hiç değişmez.
Örn: CREATE INDEX a_idx ON book(author) → indeks anahtarı = author
Arama Anahtarı (Search Key)
Sorgunun WHERE cümlesindeki sütun. Her sorgu için farklı olabilir.
Örn: WHERE author='Sciore' → arama anahtarı = author
İndeks yalnızca arama anahtarı = indeks anahtarı olduğunda kullanılabilir. author üzerine kurulan indeks, WHERE year=2005 sorgusunu hızlandıramaz — yıl değerleri sırasız dağılmıştır.
Sıralı yapının önemi — Binary Search:
Sıralı Tarama (O(N))
1.000.000 satır → 1.000.000 karşılaştırma. Her kaydı teker teker kontrol et.
Binary Search (O(log N))
1.000.000 satır → yalnızca ~20 karşılaştırma. Her adımda alanın yarısı elenir.
İndeks Türleri & Değerlendirme Kriterleri
İki temel indeks kategorisi vardır:
🗂 Sıralı İndeks (Ordered Index)
- Anahtarlar sıralı saklanır
- Nokta sorgusu: O(log N)
- Aralık sorgusu: ✅ çok verimli
- ORDER BY desteği: ✅
- Örnekler: ISAM, B⁺-Tree
#️⃣ Hash İndeks
- Anahtarlar hash fonksiyonuyla dağıtılır
- Nokta sorgusu: O(1) ortalama
- Aralık sorgusu: ❌ desteklenmez
- ORDER BY desteği: ❌
- Örnekler: Statik hash, Extendible hash
İndeks değerlendirme kriterleri:
Desteklenen Erişim Türleri
Hash yalnızca eşitlik (=). B⁺-Tree hem eşitlik hem aralık sorgularını destekler.
Erişim Süresi
Dense: doğrudan işaretçi ~2 I/O. Sparse: işaretçi + sayfa taraması ~2-3 I/O. B⁺-Tree: O(log N).
Ekleme/Silme Süresi
Her INSERT/UPDATE/DELETE tüm indeksleri günceller. Fazla indeks → yavaş yazma.
Alan Kullanımı
Dense: kayıt başına 1 giriş (büyük). Sparse: sayfa başına 1 giriş (küçük). B⁺-Tree: %50+ doluluk garantisi.
Varsayılan olarak B⁺-Tree (sıralı) indeks kullan. Yalnızca tüm sorgular eşitlik (=) gerektiriyorsa, tablo boyutu sabit kalıyorsa ve DBMS iyi destekliyorsa hash indeks düşünülebilir.
Dense, Sparse & Çok Seviyeli İndeks
Dense (Yoğun) İndeks
- Her kayıt için 1 indeks girişi
- Sıralı veya sırasız tablolarda çalışır
- Doğrudan işaretçi → en hızlı arama
- Daha fazla alan kullanır
- Secondary (unclustered) indeks için zorunlu
Sparse (Seyrek) İndeks
- Her sayfa için 1 indeks girişi (ilk kayıt)
- Yalnızca sıralı (clustered) tablolarda çalışır
- Daha az alan kullanır
- İşaretçi → sayfa → sayfa içinde tara
Neden sparse indeks sırasız tabloda çalışmaz?
✅ Sıralı Tablo — Sparse Çalışır
❌ Sırasız Tablo — Sparse ÇALIŞMAZ
Çok Seviyeli (Multi-Level) İndeks: İndeks üstüne indeks kurulur. Alt seviye sparse indeks, üst seviye çok daha seyrek. Bu yaklaşım B⁺-Tree'ye evrilir.
Primary vs Secondary İndeks:
| Özellik | Primary (Clustered) | Secondary (Unclustered) |
|---|---|---|
| Tablo sıralı mı? | EVET | HAYIR |
| Tablo başına kaç tane? | Yalnızca 1 | İstenildiği kadar |
| Dense mi Sparse mi? | Sparse olabilir (tercih) | Dense olmak zorunda |
| İlgili kayıtlar diskte? | Bitişik → az I/O | Dağınık → fazla I/O |
İndeks girişi alternatifleri:
Alt 1 — Tam Kayıt
İndeks dosyası aynı zamanda tablodur. Tablo yoktur ayrıca. En hızlı okuma (1 I/O). Tabloda sadece 1 tane olabilir.
Alt 2 — (anahtar, işaretçi)
Anahtar + kayda giden tek işaretçi. N eşleşen kayıt varsa N giriş. Birden fazla tabloda kullanılabilir.
Alt 3 — (anahtar, işaretçi listesi)
Benzersiz anahtar başına tek giriş, tüm eşleşmelerin işaretçi listesiyle. Alt 2'den daha kompakt.
İndeksi SQL ile Oluşturma
-- Temel indeks: CREATE INDEX a_idx ON book(author); -- WHERE author='Sciore' ve ORDER BY author sorgularını hızlandırır -- Benzersiz indeks (PRIMARY KEY benzeri): CREATE UNIQUE INDEX isbn_idx ON book(isbn); -- ISBN aramasını hızlandırır VE tekrar girişi önler -- Bileşik indeks (iki sütun): CREATE INDEX age_sal_idx ON emp(age, sal); -- WHERE age=20 AND sal>10 gibi sorguları hızlandırır -- İndeksi silmek: DROP INDEX a_idx ON book; -- Yalnızca indeks dosyasını siler, tablo verisi değişmez
Bileşik (Composite) Anahtar İndeksler
Bileşik indeks iki veya daha fazla sütun üzerine kurulur. Girişler leksikografik sırayla — önce birinci sütuna, eşitlerde ikinci sütuna göre — saklanır.
Sıra: (10,12) → (11,80) → (12,20) → (13,75) — önce age, eşit age'lerde sal'a göre sıralı.
| Sorgu | İndeks Kullanımı | Açıklama |
|---|---|---|
WHERE age=12 AND sal=20 | TAM | Her iki sütun eşleşiyor |
WHERE age=12 AND sal>10 | KISMİ | age=12 grupları içinde sal sıralı |
WHERE age>10 | KISMİ | Soldan başlayan sütun kullanılıyor |
WHERE sal=20 AND age>10 | HAYIR | sal soldan başlamıyor |
WHERE sal=20 | HAYIR | sal tek başına ilk sütun değil |
(age, sal) indeksi yalnızca age ile veya age + sal ile başlayan sorgulara yardımcı olabilir. Sal yalnız başına ilk sütun olmadığından bu indeks kullanılamaz.
ISAM — Statik Ağaç İndeksi
ISAM (Indexed Sequential Access Method), B⁺-Tree'den önce yaygın kullanılan ağaç yapılı bir indekstir. Hem nokta hem aralık sorgularını destekler.
Ağaç düğümleri oluşturulduğunda sabit kalır. Veri sayfaları dolduğunda taşma sayfaları (overflow pages) oluşur ve bunlar zincir oluşturur. Binlerce ekleme → binlerce taşma sayfası → arama 2 I/O yerine 20+ I/O'a çıkabilir.
B⁺-Tree, tam olarak bu problemi çözmek için geliştirildi. Her ekleme ve silmede kendini otomatik yeniden düzenler — taşma sayfası hiçbir zaman oluşmaz.
B⁺-Tree — Dinamik Dengeli İndeks
B⁺-Tree, modern veritabanlarının standart indeksidir. Dört temel özelliği vardır:
Height-Balanced
Kökten yaprağa tüm yollar eşit uzunluktadır. Hiçbir "sıcak nokta" yoktur.
%50 Doluluk Garantisi
Her düğüm: d ≤ m ≤ 2d giriş. Düğümler her zaman en az yarı doludur.
Dinamik
Eklemede böl (split), silmede birleştir (merge). Ağaç kendini otomatik dengeler.
Yaprak Bağlantısı
Yaprak sayfaları bağlı liste oluşturur → aralık taraması kökten geçmeden yapılır.
Nokta sorgusu — 5 bul:
- Kök: 5 < 17 → sol dala git
- İç düğüm [5|14]: 5 sınırını bul → L1 yaprağına git
- Yaprak L1: [2,3,5,14,16] → 5 bulundu! Toplam: ~2 I/O
Aralık sorgusu — ≥24 olan tüm değerler:
- 24'ü içeren yaprağa (L3: [24,27,29]) git
- Değerleri topla
- Sibling işaretçisi ile L4'e geç → [33,38] topla
- Sonuna kadar devam et. Köke dönmek gerekmez!
PostgreSQL, MySQL InnoDB, Oracle, SQL Server — hepsi varsayılan olarak B⁺-Tree kullanır. Hem eşitlik hem aralık sorgularını destekler, büyüdükçe O(log N) garanti eder, %50 doluluk ile alan kullanımı verimlidir.
Hash İndeks — Statik Hashing
Hash indeks, anahtar değerini doğrudan kova (bucket) numarasına dönüştürmek için bir hash fonksiyonu kullanır. Eşitlik sorguları için idealdir.
h(key) fonksiyonu çalıştır → kova numarasını bul → o kovaya doğrudan git → kova içinde sıralı ara. Örn: h("Physics") = 3 → Kova 3'e git → Einstein, Gold, Kim kayıtları.
Çarpışma (Collision): Farklı anahtarlar aynı kovaya düşebilir. Örn: h("Physics") = h("Elec.Eng.") = 3. Kova içinde sıralı tarama yapılır — genellikle az kayıt vardır.
❌ Sınırlama 1: Statik
Kova sayısı sabittir. Tablo büyüdükçe kovalar taşar, zincir oluşur → performans düşer.
❌ Sınırlama 2: Aralık Yok
h("Math")=7, h("Physics")=3. Kova numaraları arasında sıra ilişkisi yoktur. BETWEEN 'M' AND 'P' → tüm kovalar taranmalı.
| Özellik | B⁺-Tree (Sıralı) | Hash İndeks |
|---|---|---|
| Nokta sorgusu (=) | Hızlı O(log N) | Çok hızlı O(1) |
| Aralık sorgusu (BETWEEN) | Çok verimli | Desteklenmez |
| ORDER BY desteği | Evet | Hayır |
| Büyüyen tablolarda | O(log N) garanti | Taşma zinciri riski |
| PostgreSQL | Varsayılan | Var ama önerilmez |
| Oracle | Varsayılan | Statik hash org. |
| SQL Server | Yalnızca B⁺-Tree | Yok |
| MySQL InnoDB | Varsayılan | Yok |
DROP INDEX — İndeksler Ne Zaman Zararlı?
DROP INDEX index_adi ON tablo_adi; -- Yalnızca indeks dosyasını siler, tablo verisi hiç değişmez. -- Sonraki sorgular tam tablo taramasına döner.
Her INSERT / UPDATE / DELETE komutu tablodaki tüm indeksleri günceller. 5 indeks varsa 1 satır eklemek = 6 yazma işlemi (1 tablo + 5 indeks). Yoğun yazma iş yüklerinde bu ciddi performans kaybı demektir.
İndeks OLUŞTURMA'dan kaçınılması gereken durumlar:
🗂 Küçük Tablolar
Tam tarama zaten hızlıdır. İndeks ek yükü faydasından ağır basar.
🔄 Sık Güncellenen Sütunlar
Her UPDATE indeks girişini yeniden yazar. Yüksek değişim sütunlarına indeks koymayın.
📦 Toplu Ekleme İşlemleri
Bulk load öncesi indeksleri silin, sonra yeniden oluşturun. Böylece çok daha hızlı.
🚫 NULL Değerli Sütunlar
Çok NULL içeren sütunlar nadiren aranır. İndeks alan israfı yaratır.
📊 Düşük Kardinalite
Yalnızca E/K, M/F gibi 2-3 farklı değer alan sütunlar için indeks seçici değildir.
İleri Düzey İndeks Türleri (Oracle)
Üretim veritabanları belirli kullanım senaryoları için özel indeks türlerini destekler. Varsayılan her zaman standart B⁺-Tree'dir.
Normal (B-Tree)
Standart B⁺-Tree. Genel amaçlı, her tür sorguya uygun. CREATE INDEX ile varsayılan olarak oluşur.
Bitmap İndeks
Her ayrı anahtar değeri için bit dizisi saklar. Düşük kardinalite + okuma ağırlıklı veri ambarı (DW) için idealdir. OLTP'de ağır yazma, bitmapleri sürekli yeniden yazar → kötü.
Partitioned İndeks
İndeks, tablo bölümleri (partitions) üzerine dağıtılır. Tarihe veya bölgeye göre bölünmüş çok büyük tablolar için kullanılır.
Function-Based İndeks
Ham sütun değil, hesaplanmış bir ifade üzerine kurulur. Örn: UPPER(name) veya sal*12 gibi ifadeleri içeren WHERE koşulları için gereklidir.
Domain İndeks
Uygulamaya özgü indeks türü. Uzamsal veri, tam metin arama, XML gibi özel operatörler için kullanılır. ODCIIndex arayüzü gerektirir.
Bu ders kapsamında standart B⁺-Tree (Normal) indeks yeterlidir ve her büyük veritabanı sisteminde desteklenir. Bitmap yalnızca düşük kardinalite + okuma ağırlıklı veri ambarlarında düşünülebilir. Diğerleri ileri düzey özelleşmedir.
Tüm Konuların Özet Karşılaştırması
View vs Materialized View:
| Özellik | View | Materialized View |
|---|---|---|
| Veri depolama | ❌ Hayır (sanal) | ✅ Evet (disk) |
| Her sorguda hesaplama | ✅ Evet | ❌ Hayır (önbellekli) |
| Güncellik | Her zaman güncel | Yenileme gerekebilir |
| Performans | Normal | Çok hızlı |
| Kullanım | Güvenlik, basitlik | Karmaşık + sık sorgular |
Dense vs Sparse İndeks:
| Özellik | Dense | Sparse |
|---|---|---|
| Giriş sayısı | 1 / kayıt | 1 / sayfa |
| Sırasız tablo | Çalışır | Çalışmaz |
| Alan kullanımı | Fazla | Az |
| Secondary indeks | Kullanılabilir | Kullanılamaz |
Tüm İndeks Yapıları:
| Yapı | Nokta (=) | Aralık | Statik/Dinamik | Tavsiye |
|---|---|---|---|---|
| Heap File | O(N) | O(N) | — | İndeks ekle |
| ISAM | O(log N) | O(log N) | Statik | Eski, B⁺ kullan |
| B⁺-Tree | O(log N) | O(log N) | Dinamik | ✅ Varsayılan |
| Hash | O(1) | Desteklenmez | Statik | Yalnızca = sorguları |
| Bitmap | Çok hızlı | Evet | Dinamik | DW + düşük kard. |