2. Gökhan Atıl
• DBA Takım Lideri
• Oracle ACE (2011)
• TROUG Kurucu Üyesi ve Başkan Yardımcısı
• Database 10g/11g ve EBS R12 OCP
• Exadata Expert, SQL Expert
• Linux+
• Yazar: Expert Oracle Enterprise Manager 12c
• Blogger (2008) www.gokhanatil.com
3. Ajanda
• Index Nedir?
• Oracle’da Kaç Çeşit Index Vardır?
• B-Tree (Balanced Tree) Indexler
• Birleşik (birden fazla kolon içeren) Indexler
• Fonksiyon Bazlı Indexler
• Reserve Key ve Descending Indexler
• Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
• Indexlerle İlgili Önemli İpuçları
9. Tablomda Hangi Indexler Var?
• SELECT i.index_name, i.uniqueness, i.status,
i.distinct_keys, c.column_position, c.column_name
FROM user_indexes i, user_ind_columns c
WHERE i.index_name = c.index_name
AND i.table_name = ‘EMPLOYEES’
ORDER BY i.index_name, c.column_position;
10. Sorgum Hangi Indexi Kullanıyor?
• EXPLAIN PLAN FOR select * from employees where
employee_id=100;
• SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
12. B-Tree Index Nasıl Oluşturulur?
• CREATE [UNIQUE] INDEX index_ismi ON tablo_ismi
(kolon_ismi [DESC], kolon_ismi ) [ONLINE] [REVERSE];
• CREATE INDEX emp_name
ON employees (last_name);
• CREATE UNIQUE INDEX emp_id
ON employees (employee_id);
• Tabloya eklenen Primary Key ve Unique Kısıtları, eğer ilgili
kolonda index yoksa otomatik olarak unique index
oluşturulmasına sebep olur.
13. Birleşik (birden fazla kolon içeren) Indexler
• Birden fazla kolon içeren indexlerde, index oluşturulurken
belirtilen kolon sırası önemlidir. Sıralamayı yaparken kolonların
ne kadar sıklıkla sorgularda kullanıldığına dikkat edin:
• CREATE INDEX emp_ndx1 ON emp (last_name,
employee_id);
• CREATE INDEX emp_ndx2 ON emp (employee_id,
last_name);
• Birleşik indexlerdeki ilk kolon, tek kolon içeren indexin yerini
tutar.
14. Fonksiyon Bazlı Indexler
• Eğer sorgu kriterlerinde fonksiyon kullanılarak filtreleme
yapılıyorsa, fonksiyon bazlı indexler oluşturmak
gerekebilir.
• SELECT * FROM EMPLOYEES WHERE
UPPER(last_name) = 'KING';
15. Fonksiyon Bazlı Indexler
• Fonksiyon bazlı index oluşturulduktan sonra:
• CREATE INDEX emp_upper_last ON EMPLOYEES
(UPPER(last_name));
• SELECT * FROM EMPLOYEES WHERE
UPPER(last_name) = 'KING';
16. Reverse Key ve Descending Indexler
• Reverse Key indexler, çok yüksek insert işlemleri yapılan
tablolarda indexlerde oluşabilecek hot blockları
engellemek için kullanılır.
• CREATE INDEX emp_id ON emp (employee_id)
REVERSE;
• Descending Indexlerde, indexlenen alanın değerleri azalan
şekilde tutulur.
• CREATE INDEX emp_id ON emp (employee_id DESC);
17. Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
1. Index Unique Scan
• SELECT * FROM employees
WHERE employee_id = 100;
18. 2. Index Range Scan
• SELECT * FROM emp
WHERE employee_id = 100;
Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
19. 3. Index Skip Scan
• SELECT * FROM employees
WHERE first_name = ‘Steven’;
Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
20. 4. Full Index Scan
• SELECT first_name, last_name FROM employees
ORDER BY last_name;
!
B-Tree Indexler sadece NULL olmayan değerleri tutarlar!
• Full Index Scan için Oracle o kolonda NULL değer
olmadığını bilmelidir.
Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
21. 5. Fast Full Index Scan
• SELECT first_name, last_name FROM emp;
!
• Fast Full Index Scan için Oracle o kolonda NULL değer
olmadığını bilmelidir.
Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
22. Indexlerle İlgili Önemli İpuçları
Her zaman index
kullanmalı mıyım?
Tabloda çok değişiklik
oldu, indexi rebuild
etmeli miyim?
Her kolona index
eklemeli miyim?
23. Her Kolona Index Eklemeli miyim?
• Her index, insert ve delete işlemlerine ek maliyet getirir ve
diskte yer kaplar.
• Örnek bir tabloya 430.000 kayıt atalım:
0
1
2
3
0 1500 3000 4500 6000
24. Her Zaman Index Kullanmalı mıyım?
• Oracle’da bir sorgu çalıştırmak istediğinizde, Optimizer
devreye girer ve sorgunuzdan dönecek satır sayılarına
göre veriye en uygun erişim metodunu seçer. Optimizer'ın
index kullanımı yerine tablonun tamamını okumayı tercih
etmesi her zaman yanlış olmayabilir.
25. Indexler ve “Selectivity”
• Kolondaki eşsiz değer sayısının toplam değer sayısına
oranına index selectivity denir. Selectivity ne kadar yüksekse
indexin sorgu performansına faydası o kadar artar.
Block 1
!
ABBCD
Block 2
!
EFGGH
Block 3
!
HJKLM
Block 4
!
MNOPR
Block 5
!
STUVY
Block 1
!
AAAAA
Block 2
!
AAABB
Block 3
!
BBBBB
Block 4
!
BBCCC
Block 5
!
CCCCC
26. Indexler ve “Clustering” Faktör
• Eğer tablodaki her kayıda, index sırasına göre ve index
okuyarak erişmek istenirse, veritabanının yapacağı I/O
sayısına clustering faktör denir. Düşük olması tercih edilir.
Block 1
!
AAAAA
Block 2
!
BBBBB
Block 3
!
CCCCC
Block 4
!
DDDDD
Block 5
!
EEEEE
Block 1
!
ABCDE
Block 2
!
ABCDE
Block 3
!
ABCDE
Block 4
!
ABCDE
Block 5
!
ABCDE
27. Optimizer Doğru Kararı Nasıl Verecek?
• Oracle Optimizer’ın doğru seçimler yapması için tablo ve
indexler hakkında güncel bilgiye sahip olması gerekir:
• DBMS_STATS.GATHER_TABLE_STATS( 'HR', 'EMP' );
• Zamanla veritabanınız ve tablolarınız büyüyeceği için, güncel
olmayan tablo istatistiklerinin tekrar hesaplanması
sorgularınızın hızlı çalışması için önemlidir.
• Tablo küçükken performanslı olan bir çalışma planı
(execution plan), tablo büyüdükçe doğru olmayabilir.
Optimizer, indexlerinizi kullanmayı bırakınca hemen kızmayın!
28. Oracle SQL Optimizer’a Güvenin!
Sorgudaki WHERE koşuluna
indexli kolonu ekledim, index
kullanmaya başladı!
HAYIR
29. Bu Sorgu Neden Index Kullanmıyor?
• SELECT COUNT(*) FROM tarihler
WHERE TRUNC(tarih) = DATE’2015-04-01’;
!
!
• SELECT COUNT(*) FROM tarihler
WHERE tarih >= DATE’2015-04-01'
and tarih < DATE’2015-04-01’ +1;
30. Bu Sorgu Neden Index Kullanmıyor?
• SELECT * FROM employees
WHERE salary + 2000 > 22000;
!
!
• SELECT * FROM employees
WHERE salary > 20000;
31. Bu Sorgu Neden Index Kullanmıyor?
• SELECT * FROM employees
WHERE last_name LIKE ‘%ing’;
!
!
• SELECT * FROM employees
WHERE last_name LIKE ‘K%';
32. Indexleri Ne Zaman Rebuild Etmeliyim?
• B-Tree indexler her zaman “balanced” durumdadır.
• B-Tree indexlerde silinen bloklar, yeniden kullanılır.
• B-Tree indexlerde rebuild işlemi clustering fakörünü veya
selectivity’yi değiştirmez.
• B-Tree indexlerde rebuild işlemi branch seviyesini genelde
değiştirmez.
• B-Tree indexlerde rebuild işlemi, (FAST) FULL INDEX
SCAN işleminin hızlanmasını sağlayabilir.
33. Indexleri Ne Zaman Rebuild Etmeliyim?
• Örnek bir tablo üzerinde bir çok delete, insert yapıldıktan
sonra indexlerin durumu:
!
!
• Rebuild sonrası durum:
34. Son Söz
• Genel Kural: Tablonun %15 veya daha azına erişiyorsanız indexler veriye
hızlı erişmenize yarayabilir. Aksi halde tabloya full table scan yapılması
daha hızlı sonuç verebilir. Güncel istatistiklerle beslenen Optimizer’a
güvenin.
• Where koşullarında indexlenmiş kolonlar kullanıyorsanız, index kullanımını
engelleyici ifadelerden kaçının.
• Tablodaki verinin karakteristliğine bağlı olan index seçiciliği ve clustering
faktör index kullanımının performansını etkiler.
• Tabloda index arttıkça, DML operasyonlarında yavaşlama olur.
• Oracle’da B-tree indexlerin yeniden oluşturulması genelde olumlu etki
yaratmaz, ancak kısa süreli bir iyileştirme hissedilebilir.