oracle ındex

YUNUS EMRE ATAY

oracle_index

Oracle Index Nedir?

Veritabanı performansı söz konusu olduğunda, akla gelen ilk ve en etkili optimizasyon yöntemi indeksleme (indexing) mekanizmasıdır. Bir SQL sorgusunun milisaniyeler içinde mi yoksa dakikalarca mı süreceği, çoğu zaman doğru indeks stratejisine bağlıdır. Bu rehberde, Oracle veritabanındaki indeks tiplerini, çalışma mantıklarını, ne zaman kullanılmaları gerektiğini ve ne zaman kullanılmamaları gerektiğini en ince detayına kadar inceleyeceğiz.


Oracle İndex Nedir ve Neden Önemlidir?

En basit benzetme ile indeks; kalın bir kitabın sonundaki “Dizin” sayfasıdır. Kitapta belirli bir konuyu aradığınızı düşünün. Tüm sayfaları tek tek çevirmek (Full Table Scan) yerine, dizin sayfasına gidip o konunun hangi sayfada olduğunu bulur ve doğrudan o sayfaya gidersiniz (Index Scan).

Oracle mimarisinde indeksler, veriye erişim yolunu (access path) kısaltarak I/O (Input/Output) maliyetini düşürür ve sorgu performansını dramatik şekilde artırır. Ancak her indeks her tabloya uymaz; yanlış indeks seçimi sistemi yavaşlatabilir bile.


Temel Kavramlar: Kardinalite ve Seçicilik

İndex türlerine geçmeden önce iki kritik terimi anlamalıyız:

  1. Cardinality (Çeşitlilik): Bir kolondaki benzersiz (unique) değer sayısıdır. (Örn: T.C. Kimlik No yüksek kardinaliteye, Cinsiyet kolonu düşük kardinaliteye sahiptir).
  2. Selectivity (Seçicilik): Sorgunun ne kadar az satır döndürdüğüdür. İndeksler, yüksek seçicilik (az satır dönüşü) olan sorgularda en iyi performansı verir.

Oracle İndex Çeşitleri ve Kullanım Senaryoları

Oracle dünyasında en sık kullanılan indeks tiplerini ve kod örneklerini aşağıda bulabilirsiniz.

1. B-Tree (Balanced Tree) İndex

Oracle’ın varsayılan indeks tipidir. Eğer özel bir tür belirtmezseniz (CREATE INDEX dediğinizde), Oracle arka planda bir B-Tree indeks oluşturur.

  • Yapısı: Ağaç yapısına benzer. Kök (Root), Dallar (Branch) ve Yapraklar (Leaf) bloklarından oluşur.
  • Ne Zaman Kullanılmalı?
    • Kardinalitesi yüksek (çok çeşitli) verilerde (Müşteri ID, Telefon No, E-posta vb.).
    • OLTP (Online Transaction Processing) sistemlerde.
    • =, >, <, BETWEEN gibi operatörlerin kullanıldığı sorgularda.
-- Standart bir B-Tree İndex
CREATE INDEX idx_musteri_soyad 
ON musteriler(soyad);

-- Composite (Birleşik) B-Tree İndex (Sıralama önemlidir!)
CREATE INDEX idx_musteri_ad_soyad 
ON musteriler(ad, soyad);

2. Bitmap İndex

B-Tree’nin tam tersi bir mantıkla çalışır. Veriyi ağaç yapısında değil, bit haritaları (0 ve 1’ler) şeklinde tutar.

  • Ne Zaman Kullanılmalı?
    • Kardinalitesi Düşük (Low Cardinality) kolonlarda (Cinsiyet, Medeni Hal, Evet/Hayır alanları).
    • Data Warehouse (Veri Ambarı) ve OLAP sistemlerinde.
    • AND, OR gibi mantıksal operatörlerin yoğun olduğu raporlama sorgularında.
  • Ne Zaman KULLANILMAMALI?
    • Yoğun INSERT, UPDATE, DELETE işlemi gören tablolarda. (Bitmap indeksler güncellenirken çok geniş bir alanı kilitler – locking issue).
-- Cinsiyet kolonu için Bitmap İndex (Sadece 'E' ve 'K' değerleri var)
CREATE BITMAP INDEX idx_bm_cinsiyet 
ON personel(cinsiyet);

3. Function-Based İndex (FBI)

Veri tabanında veri “Oracle” olarak kayıtlıyken siz WHERE UPPER(ad) = ‘ORACLE’ şeklinde sorgu atarsanız, standart indeksler devre dışı kalır. Çünkü kolon üzerinde bir fonksiyon çalıştırılmıştır. FBI burada devreye girer.

  • Ne Zaman Kullanılmalı?
    • Sorgularda kolonlar üzerinde matematiksel işlem veya fonksiyon (UPPER, LOWER, NVL vb.) kullanılıyorsa.
    • Büyük/Küçük harf duyarsız aramalar için.
-- Fonksiyon bazlı indeks oluşturma
CREATE INDEX idx_upper_ad 
ON personel(UPPER(ad));

-- Artık şu sorgu indeksi kullanacaktır:
SELECT * FROM personel WHERE UPPER(ad) = 'ORACLE';

4. Unique İndex

Bu indeks türü hem performans sağlar hem de veri bütünlüğünü (Data Integrity) korur. İndekslenen kolona mükerrer (tekrarlayan) kayıt girilmesini engeller. Primary Key tanımladığınızda Oracle otomatik olarak bir Unique Index oluşturur.

-- TC Kimlik No gibi benzersiz olması gereken alanlar için
CREATE UNIQUE INDEX idx_uniq_tcno 
ON vatandas(tc_kimlik_no);

5. Reverse Key İndex

Genellikle Oracle RAC (Real Application Clusters) ortamlarında kullanılır. Sıralı artan değerlerde (Sequence ile artan ID’ler gibi) B-Tree indeksin hep aynı bloğuna (Right-Hand Growth) yazılmasını önlemek için veriyi ters çevirerek (Örn: 123 -> 321) saklar.

  • Avantajı: I/O darboğazını (Hot block contention) engeller
  • Dezavantajı: Range scan (BETWEEN, >, <) sorgularında kullanılamaz, sadece eşitlik (=) sorgularında çalışır.
-- Reverse Key İndex oluşturma
CREATE INDEX idx_siparis_rev 
ON siparisler(siparis_id) REVERSE;

6. Composite İndex

Birden fazla kolonu tek bir indekste tutar.

  • Kritik Kural (Leading Column): WHERE koşulunda en sık kullanılan ve en seçici kolon, indeks tanımında en başa yazılmalıdır.
  • Skip Scan: Oracle, ilk kolon sorguda olmasa bile bazen bu indeksi kullanabilir (ancak maliyetlidir).
-- Önce Soyad, sonra Ad
CREATE INDEX idx_ad_soyad ON personel(soyad, ad);

7. Index-Organized Tables (IOT)

Normalde (Heap Table) veri ve indeks ayrı yerlerde durur. IOT’de ise tablonun kendisi bir B-Tree indeksidir. Veri, Primary Key’e göre sıralı fiziksel olarak saklanır.

  • Kullanım Alanı: Sadece Primary Key ile erişilen dar tablolar (Lookup tabloları)
CREATE TABLE ulke_kodlari (
    kod_id NUMBER PRIMARY KEY,
    ulke_adi VARCHAR2(50)
) ORGANIZATION INDEX;

8. Partitioned Indexes

Büyük indeksleri tablo partition’larına göre böler. Partitioning, yönetim ve performans avantajı sağlar (büyük miktarda veri için kritik).

  • Local Index: Her partition için ayrı indeks parçası (partition-aligned). Partition maintenance kolaydır (DROP/EXCHANGE).
  • Global Index: Tüm tablo üzerinde tek indeks ama partition’lara göre yönetilebilir. Partition operasyonlarında global indexler UNUSABLE hale gelebilir.
CREATE TABLE SALES (
    SALE_ID      NUMBER,
    SALE_DATE    DATE,
    AMOUNT       NUMBER
)
PARTITION BY RANGE (SALE_DATE) (
    PARTITION p2023 VALUES LESS THAN (DATE '2024-01-01'),
    PARTITION p2024 VALUES LESS THAN (DATE '2025-01-01')
);

9. Cluster Indexes (Hash & B-Tree Cluster)

Tabloların CREATE CLUSTER ile oluşturulduğu özel yapılarda kullanılır.

  • Index Cluster: Aynı cluster key e sahip farklı tablolardaki veriler fiziksel olarak yan yana saklanır. Join performansını artırır.
  • Hash Cluster: Veriye erişim bir hash algoritması ile hesaplanan adrese gidilerek yapılır. Fiziksel I/O en aza iner. (Eşitlik sorgularında en hızlı yöntemdir).
CREATE CLUSTER CUST_CLUSTER (CUSTOMER_ID NUMBER)
SIZE 1024;

10. Domain (Custom) Indexler — Oracle Text, Spatial vb.

Oracle’ın sunduğu özel indeks tipleri veya kullanıcı tanımlı indeks motorlarıdır (index type = CTXSYS.CONTEXT gibi).

CREATE INDEX idx_doc_text ON documents(text) INDEXTYPE IS CTXSYS.CONTEXT;

11. Invisible, Compressed, Online/Offline ve Unusable Index’ler

Invisible Index

Optimizer tarafından görülmez; test amaçlı veya yeni indeksin etkisini test etmek için kullanılır.

ALTER INDEX idx_emp_lastname INVISIBLE;

Compressed Index

Index’leri sıkıştırarak disk kullanımını azaltır. Özellikle prefix compression yararlı olabilir:

CREATE INDEX idx_emp_compr ON employees(last_name) COMPRESS 1;

Online Rebuild

Index rebuild sırasında tabloya erişimi kapatmadan işlem yapar:

ALTER INDEX idx_emp_lastname REBUILD ONLINE;

Unusable Index

Partition operasyonlarından sonra index UNUSABLE olabilir; yeniden build gerekir.

“oracle ındex” için bir yanıt

  1. Wһat’s up everyone, it’s my fіrst pay a quick visit
    at this web site, and article is actually fruitful for me, kеep up posting these articles or
    гeviews.

    my site :: trading platform

%s için bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Hey!

Merhaba! Ben EMRE, teknoloji, yazılım veri tabanı ve veri analitiği alanlarına tutkuluyum. Bu blogda, öğrendiklerimi ve tecrübelerimi paylaşarak faydalı içerikler sunmayı hedefliyorum. Boş zamanlarımda yeni teknolojiler keşfetmeyi, yazmayı ve kendimi geliştirmeyi seviyorum.

ıletısım adreslerım