Merhaba Arkadaşlar,

Bu yazımda Oracle Veritabanlarında Index kavramının ne olduğunu ve nasıl kullanıldığını anlatacağım. Index kavramı özellikle Oracle Veritabanlarının Performance tuning çalışmaları konusunda çokça karşımıza çıkar. Veritabanlarının vazgeçilmez ve doğru yönetilmesi çok zaruri olan önemli objelerinden birisidir. Bu yüzden index konusunu ayrıntılı bir şekilde öğrenmemiz gerekmektedir. Bu bağlamda ben bu ve bundan sonraki yazımda Index konusunda detaylı bilgileri örnekleriyle ele alacağım. Şimdi Index konusu için index nedir ve neden kullanılır sorusuna cevap vererek yazımıza başlayalım.

index

Veritabanı teknolojilerinde ( Oracle, SQL Server, Sybase, DB2, MySQL,PostreSQL vb.. ) verilerimizin tutulduğu tablolardaki verilere daha hızlı erişebilmek için oluşturduğumuz nesnelere Index denir. Index i anlamak için bir kaç canlı örnek üzerinden bahsedersek konu daha kalıcı olacaktır. Ör: Elinizde 100.000 farklı kelime içeren İngilizce-Türkçe sözlüğünün olduğunu düşünün ve siz sürekli olarak bilmediğiniz ingilizce kelimeleri sözlükten bulup türkçe karşılıklarına bakmaktasınız. Eğer bu İngilizce Türkçe sözlüğünüz Kelimelerin baş harf(ler)ine göre sıralanmasaydı ne olurdu ? Siz mesela Computer kelimesini bulmak için neredeyse Tüm sözlüğü baştan aşağı taramanız gerekecekti. Buda haliyle hem çok zaman alacaktır hemde sizi gereksiz yere yoracaktır. Ancak eğer sözlüğünüz Kelimelerin baş harf(ler)ine göre sıralanmışsa, ki mantıklı olan yolda budur bu durumda siz Computer kelimesini bulmak için Sözlüğün içindekiler kısmından C harfinin başladığı sayfaya direk gider ve aramanızı burada gerçekleştirirsiniz. İşte buradaki Sözlüğün içindekiler kısmı ve kelimelerin baş harfine göre sıralanması mantığı ile Veritabanlarında kullanılan Index mantığı aynı şeydir.

Aynı örneği üniversitelerin 2-3 katlı kütüphaneleri içinde düşünebilirsiniz. Kütüphanelerde raflar eğer kitapların Adlarına göre yada Yazarlarına göre sıralanmasaydı aradığınız bir kitap için tüm kütüphaneyi altüst etmeniz gerekecekti. İşte Kitapların adlarına göre sıralanması mantığı ile yine bizim Veritabanlarında Tablolar için oluşturmuş olduğumuz indexler aynı mantığa sahiptirler. Oracle veritabanında tablolar için index oluşturulduğu zaman Oracle fiziksel olarak bu tablonun kayıtlarını belli bir mantığa göre sıralı bir şekilde depolayıp bu kayıtların aynı zamanda ROWID bilgisini tutarlar. Burdaki Rowid bilgisini kitabın içindekiler kısmındaki bir konuya denk gelen sayfa numarası olarak düşünebilirsiniz.

Oracle veritabanında bir tablodan veri sorgulandığı zaman Oracle ilk olarak o tabloya ait index varmı yokmu bunu kontrol eder. Eğer index var ise ve istenilen kayıt sayısı tablonun ortalama %15 ine eşit veya daha az ise Oracle istenen verileri Index üzerinden bulup dönderir. Bu tip bir veri sorgulama normalden daha kısa sürede ve daha az maliyetli olarak gerçekleşir ve buna Index Scan denir. Eğer index yoksa yada index varken istenen kayıt sayısı tablonun tamamının %15 inden fazla ise Oracle bu durumda indexten gitmenin daha maliyetli olduğunu düşünüp Full Table scan dediğimiz tablonun tamamını tarar. Full table scan yada Index scan olup olmamasını Query Optimizer karar verir. Yukarda belirttiğim %15 oranıda yine bazen değişiklik gösterse de Oracle ın genel itibariyle bu konuda sunduğu threshold değeri %15 tir. Bu %15 değeri büyük tablolar için geçerli olsada denediğim küçük tablolarda %40 lara kadar varabiliyor. Ancak dediğim gibi  genel itibariyle Oracle diyorki eğer sorguladığınız veri, tablonuzun %15 ine eşit yada küçükse tablonuzda index varsa veriyi  çok hızlı bir şekilde ve daha az maliyetle size sunmak için ben indexi kullanırım diyor. Böylece istenen verileri bulmak için index kullanıldığında I/O miktarı düştüğü için hem hızlı bir şekilde veriler bulunur hemde sistem kaynakları çok tüketilmez.  Tablolarımızda Index kullanmanın avantajları olduğu gibi dezavantajları da vardır. Index kullanmanın  dezavantajları aşağıdaki gibidir.

Dezavantajları

  • Indexler fiziksel olarak Diskte yer kapladığı için gerekmedikçe Index kullanmak ekstra disk maliyetini artıracaktır.
  • Indexler genel anlamda sorgularımızda performansı artırırken DML ( insert,update,delete ) işlemlerini ise yavaşlatmaktadır. Özellikle çok fazla DML işlemleri yapılan tablolarda index kullanmamak gerekir.
  • Index kullandığımız zaman veritabanının maintenance ( index maintenance ) yükü artacağı için ekstra bir yük gelicektir.

Genel itibariyle şöyle bir durum ortaya çıkarabiliriz. Veritabanlarında çok fazla sorgu (Select) yapılan tablolarda (Genellikle Rapor çekilen OLAP sistemlerindeki tablolar ) Index kullanmak performans açısından çok faydalı olduğu gibi sistem kaynaklarınıda yormaması yönüyle de bizim için vazgeçilmez bir nimetdir. Veritabanlarında çok fazla DML( Data Manipulation Language – Insert,Update,Delete) işlemleri yapılan tablolarda (Genellikle OLTP sistemlerde görülen tablolar ) Index kullanmak maliyetli ve performans sorunlarına yol açacaktır o yüzden gerekmedikçe böyle tablolarda kullanılmamalıdır.

Oracle Veritabanında genel olarak sıklıkla kullanılan 2 tip index türü vardır bunlar aşağıdaki gibidir.

  1. B-Tree Index ( Balanced Tree Index )
  2. Bitmap Index

1- B-Tree Index ( Balanced Tree Index ): Bu index türü en çok kullanılan ve Oracle da default olarak gelen Index türüdür. B-Tree Indexin Karakterlerden oluşan bir kayıt kümesi için oluşan yapısı aşağıdaki gibidir.

index1

B-Tree Index te Oracle veriye erişirken en dıştaki Root blokla başlar. Burada uygun olan Branch e gider ordanda son olarak ilgili leaf e gider ve bu leaf te bulunan ROWID bilgisini okur. Oracle son olarak ROWID bilgisi ile istenen bloğu okuyup kullanıcıya sunar. Örneğin Yukardaki Ağaçta Luis ismi indexten aranırken ilk olarak ROOT sonra İlgili BRANCH ve son olarak doğru olan LEAF e gidip doğru olan kaydı bulup döner.

Aynı şekilde B-Tree Indexin Sayılardan oluşan bir örnek  kayıt kümesi için oluşan yapısı aşağıdaki gibidir.

index2

Bu index türü aşağıdaki gibi oluşturulabilir.

SQL> create index INDEX_ADI on INDEX_ATILACAK_TABLONUN_ADI(ilgili Kolon);
SQL> create index MID_IX on musteri(musteri_id);
SQL> create index FID_IX on fatura(fatura_id);

2. Bitmap Index: Bu index türü B-Tree den sonra en çok kullanılan index türüdür. Bu index türü belli başlı değerlerin sürekli olarak tekrar etmesi durumunda kullanılır. Mesela Cinsiyet Kolonu için sadece 2 değer vardır Erkek ve Bayan olmak üzere bu değer her kullanıcı için sürekli olarak tekrar eder yada Evet Hayır cevabı gibi sınırlı sayıda değer girilebilecek kolonlar bunlara bir örnektir. Bitmap dediğimiz şey bit haritasıdır ve 0 – 1 lerden oluşmaktadır. Bitmap index her bir kaydın ROWID bilgisini ve Bitmap değerini tutar. Bitmap index in yapısını gösteren bir örnek kayıt kümesi aşağıdaki gibidir.

bitmap-index-1

Bitmap index i aşağıdaki gibi oluşturabilirsiniz.

SQL> create bitmap index INDEX_ADI on INDEX_ATILACAK_TABLONUN_ADI(ilgili Kolon(lar));
SQL> create bitmap index CIN_IX on musteri(cinsiyet);

Bu indexlerin dışında da benzer mantıkla oluşturulan indexler vardır bunlar aşağıdaki gibidir.

  • Function-Based Index:  Bu index türünde indexin oluşturulduğu kolon sorgu çekilirken Karakter yada Matematiksel fonksiyon kullanması gerekiyorsa bu durumda index oluşturulurken fonksiyon tabanlı oluşturmamız gerekir bu tip indexlere Fonksiyon bazlı indexler denir. Sorgularınızın Where koşulunda fonksiyon kullandığınızda eğer indexi bu fonksiyon ile oluşturmamışsanız indexi kullanmayacaktır. Bu durumda indexi fonksiyon tabanlı oluşturmanız gerekmektedir. Bunun örneği ve ilgili scripti aşağıdaki gibidir.
SQL> Create index MAD_IX on musteri(ad);

Yukardaki gibi bir index oluşturulduğunda aşağıdaki sorgu indexi kullanmayacaktır.

SQL> select * from musteri where lower(ad)='mehmet';

Bu durumda indexi aşağıdaki gibi fonksiyon tabanlı oluşturmanız gerekmektedir.

SQL>  Create index MAD_IX on musteri(lower(ad));

Indexi yukardaki gibi fonksiyon tabanlı oluşturduğunuz zaman where koşuluna konan lower fonksiyonuna rağmen sorgu indexi kullanacaktır.

  • Concatenated Index: Bu index türü aslında B-Tree indexin gelişmiş hali diyebiliriz. Concatenated Index le beraber bir index e birden fazla kolon koyabiliriz. Örneğin: Müşteri Tablosunda Ad ve soyad kolonuna beraber index atıp sorgulayabiliriz.
SQL> Create index MAD_IX on musteri(ad,soyad);

Yukardaki gibi bir index oluşturulduğunda aşağıdaki sorgu indexi kullanabilecektir.

SQL> select * from musteri where ad='mehmet' and soyad='deveci';
  • Unique Index: Bu index türü yine B-Tree index yapısının gelişmiş hali diyebiliriz. Normalde B-Tree index yapısı Non-Unique (Benzersiz olmayan) tir. Bu index türünde oluştururken Unique keyword unu kullandığımız zaman Oracle bize Unique index oluşturacaktır. Bu index türü özellikle benzersiz kayıt içeren kolonlarda kullanılır. Aşağıdaki gibi oluşturulur.
SQL> Create unique index MTC_IX on musteri(TC_No);
  • Reverse Key Index:  Bu index te yine B-Tree index in geliştirilmiş bir türüdür. Bu index türünde index anahtarının değeri her zaman için ters çevrilir. Ör; İndeximizin değerleri 123, 456, 789 olduğunu düşünelim bu durumda Reversed key index değerleri 321, 654, 987 şeklinde olacaktır. Bu index aşağıdaki gibi oluşturulur.
SQL> create Index MID_IX on musteri(musteri_id) reverse;

Indexler hakkında genel bilgiler verdikten sonra bu yazımın sonuna gelmiş bulunmaktayım. Bir sonraki yazıda Görüşmek dileğiyle Esen Kalın…

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s