Oracle Index kavramı nedir? Nasıl kullanılır?
Oracle veritabanında index kavramı oldukça önemlidir. Hatta Performace tuning konusunda sürekli karşımıza çıkacağı aşikardır.
Oracle veritabanında tablodan bir sorgu çalıştırıldığı zaman oracle ilk önce tabloda index olup olmadığını kontrol eder ve çekilecek verinin %15 ine eşit ve daha az ise sorguyu index nesnesi üzerinden çalıştırır. Böyle bir sorgu bütün tabloyu taramasından daha hızlı çalışacaktır. Tabi küçük tablolarda çalıştığınızda bu tür sorguların hızında çok fazla değişiklik farketmeyeceksiniz fakat az önce verdiğimiz TürkTelekom örneğinde 350gb verinin tamamını taramak oldukça zor olacaktır. Velhasıl kelam bu yaptığımız işe INDEX SCAN diyoruz. Ha peki index yoksa ve çekilecek veri %15e tekabül eden rakamdan daha fazla ise ne yapıcak diye soracak olursanız, cevabı basit tüm tabloyu tarayacaktır bu işleme de FULL SCAN diyoruz.
Peki kardeşim bu index nesnesinin o kadar avantajından bahsettin yok mu bunun hiç dezavantajı diye soracak olursanız bizde bu sorunun cevabını vermeye çalışırız.
- 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.
B-Tree index : Bu index tipi oracleda belki en çok kullanılan index tipidir.
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.
sayısal verilerde ise en yukarıda verdiğimiz örneği düşünelim. dedikki 40 m kullanıcının tamamını mı taramak daha hızlı olur yoksa daha az bir miktarını mı ? sizde dedinizki tabikide daha az miktarını tararsak bu işlem daha hızlı olacaktır. Daha açık ifadeyle 1-5.000.000, 5.000.001-10.000.000 ... 35.000.001-40.000.000 ve 1-2.500.000, 2.500.001-5.000.000 şeklinde bu verileri bölersek sorgumuz daha hızlı çalışacaktır.
Evet bu kadar uzun yazıdan sonra peki index
- Nasıl oluşturulur?
- Tabloyu oluştururken indexte beraberinde oluşturulabilir mi ?
- kullanıcıların indexleri nerede tutulur?
- Sorguda fonksiyon kullanırsak Full scan mi yoksa index scan mi çalışır ?
- indexi silmeden nasıl kapatabilirim?
- oluşturduğum indexi nasıl silerim?
Genel olarak indexin yapısı şu şekildedir.
CREATE [UNIQUE]INDEX index
ON table (column[, column]...);
Aşağıda bir emp_last_name_idx adında employees tablosunun last_name kolonuna index oluşturalım
CREATE INDEX emp_last_name_idx
ON employees(last_name);
eğer oluşturduysak index EMP_LAST_NAME_IDX created bilgisini aşağıda alıcağızdır.
Bizde bir index oluşturalım fakat employees tablosunda değil de kendi oluşturduğumuz bir tabloda.
CREATE TABLE NEW_EMP
(employee_id NUMBER(6)
PRIMARY KEY USING INDEX
(CREATE INDEX emp_id_idx ON
NEW_EMP(employee_id)),
first_name VARCHAR2(20),
last_name VARCHAR2(25));
NEW_EMP adında ve employee_id,first_name,last_name kolonları olan bir tablo oluşturduk eğer farkettiydeniz employee_id kolonunu oluştururken "using index (create index.... ) " kullandık ve tablo oluşturuken indeximizide oluşturmuş olduk.
Kullanıcıların indexleri nerede tutulur ?
SELECT INDEX_NAME,TABLE_NAMEFROM
USER_INDEXES
WHERE TABLE_NAME = 'NEW_EMP';
sorgusunu çalıştırırsak
INDEX_NAME TABLE_NAME
EMP_ID_IDX NEW_EMP
karşımıza çıkacaktır. burada user_indexes tablosundan index ismini ve hangi tabloda çalıştığını görürüz.
Sorguda fonksiyon kullanırsak Full scan mi yoksa index scan mi çalışır ?
insert into employees (employee_id,first_name, last_name, email, hire_date, job_id)values (310,'JACK','KAN','JKan','10-JUN-2005','IT_PROG');
sorgusunu çalıştıralım
Evet biliyoruzki
select * from employees where last_name='KAN';
çalıştırdığımızda EMP_NAME_IX indexini kullanıcaktır. Peki ya Where tümcesinde fonksiyon kullanırsam?
select * from employees where LOWER(last_name)='kan';
ve göreceğizki FULL SCAN yapmış.
Yani sorgumuzda Fonksiyon kullanırsak oracle indexi iptal edecektir.
Peki bunu nasıl önlerim ? Tabikide indexi oluşturuken belirttiğimiz kolon isminde fonksiyon kullanarak Yani;
CREATE INDEX lower_last_name_idx
ON dept2(LOWER(last_name));
oluşturalım ve aynı şekilde select çekelim göreceğizki index olarak taratmış.
Indexi silmeden çalışılabilirliğini engellemek için ALTER INDEX kullanırız
oluşturduğumuz emp_id_idx indexini invisible yapalım
ALTER INDEX emp_id_idx INVISIBLE;
çalıştırırız. Tersinide siz düşünün.
Index Nesnesini silme
DROP INDEX emp_id_idx;Bu konumuzunda sonuna gelmiş bulunuyoruz. Yardımım dokunduysa ne mutlu. İyi Oracle'lı günler dilerim
Hiç yorum yok:
Yorum Gönder