SQL Index Nedir? Çeşitleri Nelerdir?

Herkese merhabalar. Bu yazımda Oracle DB nin sunmuş olduğu olmazsa olmazlardan biri olan Indexlerden bahsedeceğim.

Indexlerin anlaşılması için her yerde aynı örnek kullanılır fakat en akılda kalıcı ve anlaşılır örnek olduğu için ben de bu örneği kullanacağım. Şimdi bir ingilizce-Türkçe çeviri sözlüğünüz olduğunu düşünün. Öğrenmek istediğiniz kelimeyi ararken ya harf sıralamasına göre ararsınız ya da içindekiler kısmı varsa oradan bakarsınız. Indexlerin mantığı da tamamen bu şekildedir. Veri tabanınızda bir tablo oluşturdunuz daha sonra da bu tablodan bir veri çekmek istiyorsunuz. Eğer tablonuz indexli değilse, içindekiler kısmı olmayan bir kitap gibi ya da belirli bir sırada düzenlenmemiş bir sözlük gibi veri tabanınız istediğiniz sorguyu bulana dek tüm tabloyu tarar. Bu da ekstra zaman ve performans sorunu demektir. Ama tabloda bir index olmuş olsaydı tüm tabloyu aramak yerine aradığınız verinin olduğu ilgili yere bakarak size sonucu çok daha hızlı döndürmüş olacaktı. Burada arka planda olan şey şudur. Biz index oluşturduğumuz zaman oracle indexli tablodaki verilerin ROWID bilgisine göre bir sırlama oluşturur. Buradaki ROWID’yi tablodaki her bir satırın sanal ID’si şeklinde düşünebilirsiniz. Diyelim ki 1.000.000 satırlık bir tablomuz var. Bizim de istediğimiz veri de 190.115 satırda olmuş olsun. Oracle her zaman select atıldığında önce tabloda bir index var mı diye kontrol eder varsa index üzerinden ilerler yoksa tüm tabloyu tarar. Index varsa istediğimiz verinin/verilerin ROWID bilgisine/bilgilerine bakar ve kendi düzenlemiş olduğu yapıda hemen bulur. İki ana çeşidi bulunmaktadır. Bu çeşitler üzerinden ilerlediğimiz zaman daha da anlaşılır olacaktır.

1-)B-Tree Index

B*Tree İndeks Mimarisi

B-Tree Index yapısı yukarıdaki şekildeki gibidir. Bu Index tipini adından da anlaşılacağı üzere ağaç gibi düşünebiliriz. Ortada büyük bir gövde sonra dallar en son da yapraklar şeklinde. Biz sorgu attığımızda tabloda B-Tree index varsa önce Root yani ana gövde sonra branch bloka yani dallara gider buradan da istenilen dataların ROWID lerinin tutulduğu leaflere yani yapraklara gidilerek istenilen verinin ROWID’si çekilerek tablodadan ilgili data çekilir. Tabloda Index oluşturmak için;

CREATE INDEX [IndexAdı] ON [TabloAdı] ([kolon1,kolon2...]);

Burada Index tipinde oluşturulan datalar unique(benzersiz) değildir. Her datanın benzersiz olmasını istiyorsak;

CREATE UNIQUE INDEX [IndexAdı] ON [TabloAdı] ([kolon1,kolon2...]);

Bu index türünde dikkat edilmesi gereken en önemli husus indexin kullanılacağı kolonda NULL alanların olmaması gerekmektedir.

2-)BITMAP Index

Bu index türü ise bir kolondaki değerlerin çok fazla değişiklik göstermediği durumlarda kullanılabilir . Örneğin evet ya da hayır gibi veya cinsiyetin belirtildiği kolonlarda veya Türkiye deki bölgelere göre düzenlenmiş bir kolonda kullanılabilir. Bitmap index, dataların ROWID bilgisini ve BITMAP değerlerini tutarak bize istediğimiz veriyi daha performanslı bir şekilde döndürür. Bitmap indexin kullanım şekli;

CREATE BITMAP INDEX [IndexAdi] ON [TabloAdi] ([kolonlar]);
07 03 Bitmap Indexes - YouTube
Yukarıdaki resimde bir tablonun Bitmap haritası çıkarılmış. Tabloda bulunan 1005 ID li kişinin Bıtmap haritasına bakalım. Kadın olduğu durum, evli olduğu durum ve olduğu yaş aralığı için ‘1’ değeri kullanılırken kendisine ait olmayan değerler için diğer kolonlarda ‘0’ değeri kullanılmış. Burada ise yine veri tabanımız tüm datalara bakmak yerine Bitmap ROWID bilgisi ve Bıtmap haritasına bakarak istediğimiz veriyi çok daha çabuk döndürmüş oluyor.

Burada dikkat edilmesi gereken husus ise Bitmap index tanımlı kolon üzerinde bir MODIFY işlemi gerçekleştirildiğinde Bitmap index invalid konumuna geçmektedir.

3-) Function Based Index

Bu index türü aslında B-Tree indexin bir varyasyonudur. Sorgu attığınız tabloda indexli kolondan veri çekmek istediğinizde eğer sorguda bu kolon üzerinde bir fonksiyon kullanırsanız Oracle bu sorgu için indexlere bakmadan yine tüm tablo üzerinde bir tarama yapacaktır. Buradaki çözüm ise tanımlanan indexi fonksiyon kullanarak indexlemektir. Örnek verecek olursak FIRST_NAME kolonu indexli olsun. Bizde select * from hr.employees where upper(first_name)=’halil’; şeklinde bir sorgu atarsak oracle bunu index üzerinden aramayacaktır. Bunun yerine indexi; Create index index_adi hr.employees(upper(first_name)); şeklinde oluşturmamız gerekmektedir.

Indexlerle ilgili bilinmesi gerekenler;

  • Oracle, döndürmek istenilen veri, tablodaki datanın %15 ini kapsadığı ve altında olduğu durumlarda tanımlı indexi kullanır.
  • Eğer %15 kuralına uygun data çekiliyorsa execution plan adımında index scan olarak görünür yani index üzerinden data döndürülmüştür. Ama döndürülmek istenilen data tablonun %15 inden fazla ise tüm tabloya üzerinde arama yapar bu full table scan olarak görünür. Ama tabi bu durum tablonun büyüklüğü ile de alakalı olabiliyor. Küçük tablolarda bu oran %70 lere kadar çıkabiliyor.
  • Indexler select, where koşullu uptade işlemlerinde hız sağlarken insert işlemlerinde ise performans sorunlarına yol açmaktadır. Bu sebeple çoğu zaman select atılan tablolarda kullanılması uygun olacaktır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir