SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
VERİYE ERİŞİMİN
EN HIZLI YOLU: INDEXLER
Gökhan Atıl - Senior Oracle DBA
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
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ı
Index Nedir?
Index Tablo
sıralı
Oracle’da Kaç Çeşit Index Vardır?
• B-tree Indexler
• Index-organized Tablolar (IOT)
• Reverse key Indexler
• Descending (Azalan) Indexler
• B-tree Cluster Indexleri (Clustered Tablolar)
• Bitmap Indexler
• Fonksiyon Bazlı Indexler
• Application Domain Indexler
Balanced Tree Index Yapısı
linked list
split &
merge
HER
ZAMAN
DENGELİ
1
2
3
root
Index Bloklarının Diskteki Yerleşimi
• branch: 0x100020b 16777739 (0: nrow: 8, level: 2)
• branch: 0x1000824 16779300 (-1: nrow: 233, level: 1)
• leaf: 0x100020d 16777741 (-1: nrow: 254 rrow: 254)
• leaf: 0x10003a4 16778148 (0: nrow: 310 rrow: 310)
• leaf: 0x1000585 16778629 (1: nrow: 357 rrow: 357)
• leaf: 0x10006a1 16778913 (2: nrow: 345 rrow: 345)
• leaf: 0x1000817 16779287 (3: nrow: 352 rrow: 352)
• leaf: 0x1000bf3 16780275 (4: nrow: 341 rrow: 341)
Ön Hazırlık
Tablomda Hangi Indexler Var?
Sorgum Hangi Indexi
Kullanıyor (veya kullan mıyor)?
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;
Sorgum Hangi Indexi Kullanıyor?
• EXPLAIN PLAN FOR select * from employees where
employee_id=100;
• SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
Sorgum Hangi Indexi Kullanıyor?
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.
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.
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';
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';
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);
Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
1. Index Unique Scan
• SELECT * FROM employees 

WHERE employee_id = 100;
2. Index Range Scan
• SELECT * FROM emp 

WHERE employee_id = 100;
Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
3. Index Skip Scan
• SELECT * FROM employees 

WHERE first_name = ‘Steven’;
Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
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?
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?
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?
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
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.
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
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
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!
Oracle SQL Optimizer’a Güvenin!
Sorgudaki WHERE koşuluna
indexli kolonu ekledim, index
kullanmaya başladı!
HAYIR
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;
Bu Sorgu Neden Index Kullanmıyor?
• SELECT * FROM employees 

WHERE salary + 2000 > 22000;
!
!
• SELECT * FROM employees 

WHERE salary > 20000;
Bu Sorgu Neden Index Kullanmıyor?
• SELECT * FROM employees

WHERE last_name LIKE ‘%ing’;
!
!
• SELECT * FROM employees

WHERE last_name LIKE ‘K%';
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.
Indexleri Ne Zaman Rebuild Etmeliyim?
• Örnek bir tablo üzerinde bir çok delete, insert yapıldıktan
sonra indexlerin durumu:
!
!
• Rebuild sonrası durum:
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.
Dinlediğiniz için Teşekkürler!
gokhan@gokhanatil.com
gokhanatil
www.gokhanatil.com

Más contenido relacionado

Similar a TROUG & Turkey JUG Semineri: Veriye erişimin en hızlı yolu

Sql egitimi-atasehir
Sql egitimi-atasehirSql egitimi-atasehir
Sql egitimi-atasehirsersld61
 
Sql egitimi-ankara
Sql egitimi-ankaraSql egitimi-ankara
Sql egitimi-ankarasersld61
 
Sql egitimi-bagcilar
Sql egitimi-bagcilarSql egitimi-bagcilar
Sql egitimi-bagcilarsersld61
 
Sql egitimi-antalya
Sql egitimi-antalyaSql egitimi-antalya
Sql egitimi-antalyasersld61
 
Sql egitimi-esenler
Sql egitimi-esenlerSql egitimi-esenler
Sql egitimi-esenlersersld61
 
Sql egitimi-catalca
Sql egitimi-catalcaSql egitimi-catalca
Sql egitimi-catalcasersld61
 
Sql egitimi-pendik
Sql egitimi-pendikSql egitimi-pendik
Sql egitimi-pendiksersld61
 
Sql egitimi-esenyurt
Sql egitimi-esenyurtSql egitimi-esenyurt
Sql egitimi-esenyurtsersld61
 
Sql en-iyi-egitimi
Sql en-iyi-egitimiSql en-iyi-egitimi
Sql en-iyi-egitimisersld61
 
Sql egitimi-konya
Sql egitimi-konyaSql egitimi-konya
Sql egitimi-konyasersld61
 
Sql egitimi-avcilar
Sql egitimi-avcilarSql egitimi-avcilar
Sql egitimi-avcilarsersld61
 
Sql egitimi-eyup
Sql egitimi-eyupSql egitimi-eyup
Sql egitimi-eyupsersld61
 
Sql egitimi-levent
Sql egitimi-leventSql egitimi-levent
Sql egitimi-leventsersld61
 
Sql teknikeri
Sql teknikeriSql teknikeri
Sql teknikerisersld61
 
Sql egitmeni
Sql egitmeniSql egitmeni
Sql egitmenisersld61
 
Sql egitimi-adana
Sql egitimi-adanaSql egitimi-adana
Sql egitimi-adanasersld61
 
Sql egitimi-kagithane
Sql egitimi-kagithaneSql egitimi-kagithane
Sql egitimi-kagithanesersld61
 
Sql egitimi-kartal
Sql egitimi-kartalSql egitimi-kartal
Sql egitimi-kartalsersld61
 
Sql danismani
Sql danismaniSql danismani
Sql danismanisersld61
 
Sql egitimi-fatih
Sql egitimi-fatihSql egitimi-fatih
Sql egitimi-fatihsersld61
 

Similar a TROUG & Turkey JUG Semineri: Veriye erişimin en hızlı yolu (20)

Sql egitimi-atasehir
Sql egitimi-atasehirSql egitimi-atasehir
Sql egitimi-atasehir
 
Sql egitimi-ankara
Sql egitimi-ankaraSql egitimi-ankara
Sql egitimi-ankara
 
Sql egitimi-bagcilar
Sql egitimi-bagcilarSql egitimi-bagcilar
Sql egitimi-bagcilar
 
Sql egitimi-antalya
Sql egitimi-antalyaSql egitimi-antalya
Sql egitimi-antalya
 
Sql egitimi-esenler
Sql egitimi-esenlerSql egitimi-esenler
Sql egitimi-esenler
 
Sql egitimi-catalca
Sql egitimi-catalcaSql egitimi-catalca
Sql egitimi-catalca
 
Sql egitimi-pendik
Sql egitimi-pendikSql egitimi-pendik
Sql egitimi-pendik
 
Sql egitimi-esenyurt
Sql egitimi-esenyurtSql egitimi-esenyurt
Sql egitimi-esenyurt
 
Sql en-iyi-egitimi
Sql en-iyi-egitimiSql en-iyi-egitimi
Sql en-iyi-egitimi
 
Sql egitimi-konya
Sql egitimi-konyaSql egitimi-konya
Sql egitimi-konya
 
Sql egitimi-avcilar
Sql egitimi-avcilarSql egitimi-avcilar
Sql egitimi-avcilar
 
Sql egitimi-eyup
Sql egitimi-eyupSql egitimi-eyup
Sql egitimi-eyup
 
Sql egitimi-levent
Sql egitimi-leventSql egitimi-levent
Sql egitimi-levent
 
Sql teknikeri
Sql teknikeriSql teknikeri
Sql teknikeri
 
Sql egitmeni
Sql egitmeniSql egitmeni
Sql egitmeni
 
Sql egitimi-adana
Sql egitimi-adanaSql egitimi-adana
Sql egitimi-adana
 
Sql egitimi-kagithane
Sql egitimi-kagithaneSql egitimi-kagithane
Sql egitimi-kagithane
 
Sql egitimi-kartal
Sql egitimi-kartalSql egitimi-kartal
Sql egitimi-kartal
 
Sql danismani
Sql danismaniSql danismani
Sql danismani
 
Sql egitimi-fatih
Sql egitimi-fatihSql egitimi-fatih
Sql egitimi-fatih
 

Más de Gokhan Atil

Introduction to Spark with Python
Introduction to Spark with PythonIntroduction to Spark with Python
Introduction to Spark with PythonGokhan Atil
 
Introduction to Cassandra
Introduction to CassandraIntroduction to Cassandra
Introduction to CassandraGokhan Atil
 
SQL or noSQL - Oracle Cloud Day Istanbul
SQL or noSQL - Oracle Cloud Day IstanbulSQL or noSQL - Oracle Cloud Day Istanbul
SQL or noSQL - Oracle Cloud Day IstanbulGokhan Atil
 
EM13c: Write Powerful Scripts with EMCLI
EM13c: Write Powerful Scripts with EMCLIEM13c: Write Powerful Scripts with EMCLI
EM13c: Write Powerful Scripts with EMCLIGokhan Atil
 
Oracle Enterprise Manager Cloud Control 13c for DBAs
Oracle Enterprise Manager Cloud Control 13c for DBAsOracle Enterprise Manager Cloud Control 13c for DBAs
Oracle Enterprise Manager Cloud Control 13c for DBAsGokhan Atil
 
Oracle Enterprise Manager Cloud Control 13c for DBAs
Oracle Enterprise Manager Cloud Control 13c for DBAsOracle Enterprise Manager Cloud Control 13c for DBAs
Oracle Enterprise Manager Cloud Control 13c for DBAsGokhan Atil
 
EMCLI Crash Course - DOAG Germany
EMCLI Crash Course - DOAG GermanyEMCLI Crash Course - DOAG Germany
EMCLI Crash Course - DOAG GermanyGokhan Atil
 
Oracle Enterprise Manager 12c: EMCLI Crash Course
Oracle Enterprise Manager 12c: EMCLI Crash CourseOracle Enterprise Manager 12c: EMCLI Crash Course
Oracle Enterprise Manager 12c: EMCLI Crash CourseGokhan Atil
 
Oracle 12c Database In-Memory
Oracle 12c Database In-MemoryOracle 12c Database In-Memory
Oracle 12c Database In-MemoryGokhan Atil
 
Oracle DB Standard Edition: Başka Bir Arzunuz?
Oracle DB Standard Edition: Başka Bir Arzunuz?Oracle DB Standard Edition: Başka Bir Arzunuz?
Oracle DB Standard Edition: Başka Bir Arzunuz?Gokhan Atil
 

Más de Gokhan Atil (10)

Introduction to Spark with Python
Introduction to Spark with PythonIntroduction to Spark with Python
Introduction to Spark with Python
 
Introduction to Cassandra
Introduction to CassandraIntroduction to Cassandra
Introduction to Cassandra
 
SQL or noSQL - Oracle Cloud Day Istanbul
SQL or noSQL - Oracle Cloud Day IstanbulSQL or noSQL - Oracle Cloud Day Istanbul
SQL or noSQL - Oracle Cloud Day Istanbul
 
EM13c: Write Powerful Scripts with EMCLI
EM13c: Write Powerful Scripts with EMCLIEM13c: Write Powerful Scripts with EMCLI
EM13c: Write Powerful Scripts with EMCLI
 
Oracle Enterprise Manager Cloud Control 13c for DBAs
Oracle Enterprise Manager Cloud Control 13c for DBAsOracle Enterprise Manager Cloud Control 13c for DBAs
Oracle Enterprise Manager Cloud Control 13c for DBAs
 
Oracle Enterprise Manager Cloud Control 13c for DBAs
Oracle Enterprise Manager Cloud Control 13c for DBAsOracle Enterprise Manager Cloud Control 13c for DBAs
Oracle Enterprise Manager Cloud Control 13c for DBAs
 
EMCLI Crash Course - DOAG Germany
EMCLI Crash Course - DOAG GermanyEMCLI Crash Course - DOAG Germany
EMCLI Crash Course - DOAG Germany
 
Oracle Enterprise Manager 12c: EMCLI Crash Course
Oracle Enterprise Manager 12c: EMCLI Crash CourseOracle Enterprise Manager 12c: EMCLI Crash Course
Oracle Enterprise Manager 12c: EMCLI Crash Course
 
Oracle 12c Database In-Memory
Oracle 12c Database In-MemoryOracle 12c Database In-Memory
Oracle 12c Database In-Memory
 
Oracle DB Standard Edition: Başka Bir Arzunuz?
Oracle DB Standard Edition: Başka Bir Arzunuz?Oracle DB Standard Edition: Başka Bir Arzunuz?
Oracle DB Standard Edition: Başka Bir Arzunuz?
 

TROUG & Turkey JUG Semineri: Veriye erişimin en hızlı yolu

  • 1. VERİYE ERİŞİMİN EN HIZLI YOLU: INDEXLER Gökhan Atıl - Senior Oracle DBA
  • 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ı
  • 5. Oracle’da Kaç Çeşit Index Vardır? • B-tree Indexler • Index-organized Tablolar (IOT) • Reverse key Indexler • Descending (Azalan) Indexler • B-tree Cluster Indexleri (Clustered Tablolar) • Bitmap Indexler • Fonksiyon Bazlı Indexler • Application Domain Indexler
  • 6. Balanced Tree Index Yapısı linked list split & merge HER ZAMAN DENGELİ 1 2 3 root
  • 7. Index Bloklarının Diskteki Yerleşimi • branch: 0x100020b 16777739 (0: nrow: 8, level: 2) • branch: 0x1000824 16779300 (-1: nrow: 233, level: 1) • leaf: 0x100020d 16777741 (-1: nrow: 254 rrow: 254) • leaf: 0x10003a4 16778148 (0: nrow: 310 rrow: 310) • leaf: 0x1000585 16778629 (1: nrow: 357 rrow: 357) • leaf: 0x10006a1 16778913 (2: nrow: 345 rrow: 345) • leaf: 0x1000817 16779287 (3: nrow: 352 rrow: 352) • leaf: 0x1000bf3 16780275 (4: nrow: 341 rrow: 341)
  • 8. Ön Hazırlık Tablomda Hangi Indexler Var? Sorgum Hangi Indexi Kullanıyor (veya kullan mıyor)?
  • 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);
  • 11. Sorgum Hangi Indexi Kullanıyor?
  • 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.