← Database Management System Ana Sayfa
Görünümler & İndeksler — CEN208 Veritabanı Yönetim Sistemleri
CEN208 • Veritabanı Yönetim Sistemleri

Görünümler & İndeksler

Views, Materialized Views, Disk I/O, Heap File, Dense/Sparse Index, B⁺-Tree, Hash Index — tam kapsamlı Türkçe rehber

I

Görünümler (Views)

Üç şema seviyesi · Sanal tablo · Materialized view · Controlled redundancy

Slide 2

Üç Ş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.

Özet

Görünümler → Dış Şema seviyesinde yaşar & Fiziksel detayları gizler. İndeksler → Fiziksel Şema seviyesinde yaşar & sorgu performansını artırır.

Slide 3–4

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.

Temel Özellikler

View'lar sanal tablodur — disk üzerinde data saklamaz, yalnızca sorgu tanımını saklar. İçindeki query her erişimde çalışır.

Slide 5–10

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';
⚡ Önemli Kural

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.

Slide 11–19

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.
⚠️ Çok Tablolu View Sorunu

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.

Slide 20–29

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
Materialized View Ne Zaman Kullanılır?

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.

Query Optimizer

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.


II

İndeksler (Indexes)

Disk maliyeti · Heap file · Dense/Sparse · B⁺-Tree · Hash · Composite · DROP INDEX

Slide 35–37

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.

CPU Registers
< 1 ns
L1 Cache
2–4 ns
L2 Cache
~10 ns
RAM (Main Memory)
40–90 ns
HDD (Sabit Disk)
~14.000.000 ns
150K×
Disk, RAM'den yavaş
13.6 ms
1 disk erişimi
680 s
50.000 sayfa okuma
12.500×
B⁺-Tree hız kazancı

Disk erişim süresi üç bileşenden oluşur:

1

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.

2

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.

3

Transfer Süresi (Transfer Time) — 0.3 ms

Verinin manyetik yüzeyden okunması. 13 MB/s transfer → 4 KB sayfa → 0.3 ms.

Erişim Süresi = 9.1 + 4.17 + 0.3 = ~13.6 ms IBM Deskstar 14GPX parametreleriyle
Veritabanı Maliyet Modeli

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ç
Slide 38

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)!

Sorun

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

Slide 39–42

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

İndeks Dosyası

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

⚡ Kritik Kural

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

Slide 40–41

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

✅ Pratik Tavsiye

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.

Slide 44–48

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
10Sayfa 1
30Sayfa 2
50Sayfa 3
40 aranırken: indeks "30→S2" der. Tablo sıralı olduğundan 40 kesinlikle S2'dedir. ✅
❌ Sırasız Tablo — Sparse ÇALIŞMAZ
50Sayfa 1
70Sayfa 2
40Sayfa 3
40 aranırken: S2 "70" ile başlıyor. 40 nerede? Bilinmiyor! ❌

Ç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:

ÖzellikPrimary (Clustered)Secondary (Unclustered)
Tablo sıralı mı?EVETHAYIR
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/ODağı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.

Slide 43

İ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
Slide 48–49

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.

Örnek: emp(age, sal) indeksi

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=20TAMHer iki sütun eşleşiyor
WHERE age=12 AND sal>10KISMİage=12 grupları içinde sal sıralı
WHERE age>10KISMİSoldan başlayan sütun kullanılıyor
WHERE sal=20 AND age>10HAYIRsal soldan başlamıyor
WHERE sal=20HAYIRsal tek başına ilk sütun değil
En Sol Önek Kuralı (Leftmost Prefix Rule)

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

Slide 50–51

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.

ISAM'ın Ölümcül Kusuru: Statik Yapı

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.

ISAM → B⁺-Tree

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.

Slide 51–53

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.

Kök [17 | 24 | 30] / | | \ [5|14] [19|22] [27|29] [33|38] ↕ ↕ ↕ ↕ ← yaprak bağlantısı (range scan için) L1 → L2 → L3 → L4

Nokta sorgusu — 5 bul:

Aralık sorgusu — ≥24 olan tüm değerler:

O(logf N) arama/ekleme/silme maliyeti f = fanout (~100), N = yaprak sayfa sayısı → çok sığ ağaç
B⁺-Tree Neden Her Yerde?

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.

Slide 52–56

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.

Nasıl Çalışır?

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

ÖzellikB⁺-Tree (Sıralı)Hash İndeks
Nokta sorgusu (=)Hızlı O(log N)Çok hızlı O(1)
Aralık sorgusu (BETWEEN)Çok verimliDesteklenmez
ORDER BY desteğiEvetHayır
Büyüyen tablolardaO(log N) garantiTaşma zinciri riski
PostgreSQLVarsayılanVar ama önerilmez
OracleVarsayılanStatik hash org.
SQL ServerYalnızca B⁺-TreeYok
MySQL InnoDBVarsayılanYok
Slide 57–58

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.
Gizli Maliyet

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.

Slide 58–59

İ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 İçin

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.


Özet

Tüm Konuların Özet Karşılaştırması

View vs Materialized View:

ÖzellikViewMaterialized View
Veri depolama❌ Hayır (sanal)✅ Evet (disk)
Her sorguda hesaplama✅ Evet❌ Hayır (önbellekli)
GüncellikHer zaman güncelYenileme gerekebilir
PerformansNormalÇok hızlı
KullanımGüvenlik, basitlikKarmaşık + sık sorgular

Dense vs Sparse İndeks:

ÖzellikDenseSparse
Giriş sayısı1 / kayıt1 / sayfa
Sırasız tabloÇalışırÇalışmaz
Alan kullanımıFazlaAz
Secondary indeksKullanılabilirKullanılamaz

Tüm İndeks Yapıları:

YapıNokta (=)AralıkStatik/DinamikTavsiye
Heap FileO(N)O(N)İndeks ekle
ISAMO(log N)O(log N)StatikEski, B⁺ kullan
B⁺-TreeO(log N)O(log N)Dinamik✅ Varsayılan
HashO(1)DesteklenmezStatikYalnızca = sorguları
BitmapÇok hızlıEvetDinamikDW + düşük kard.
B⁺-Tree = Standart Seçim Hash = Yalnızca Eşitlik Materialized View = Performans İçin Dense = Her Zaman Güvenli Sparse = Yalnızca Clustered