Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

562 views

Published on

TROUG & Turkey JUG ortak etkinliğinde, developerlar için hazırlamış olduğum B-Tree indexler üzerine yaptığım sunum

Published in: Software
  • Be the first to like this

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

  1. 1. VERİYE ERİŞİMİN EN HIZLI YOLU: INDEXLER Gökhan Atıl - Senior Oracle DBA
  2. 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. 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ı
  4. 4. Index Nedir? Index Tablo sıralı
  5. 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. 6. Balanced Tree Index Yapısı linked list split & merge HER ZAMAN DENGELİ 1 2 3 root
  7. 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. 8. Ön Hazırlık Tablomda Hangi Indexler Var? Sorgum Hangi Indexi Kullanıyor (veya kullan mıyor)?
  9. 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. 10. Sorgum Hangi Indexi Kullanıyor? • EXPLAIN PLAN FOR select * from employees where employee_id=100; • SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
  11. 11. Sorgum Hangi Indexi Kullanıyor?
  12. 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. 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. 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. 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. 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. 17. Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir? 1. Index Unique Scan • SELECT * FROM employees 
 WHERE employee_id = 100;
  18. 18. 2. Index Range Scan • SELECT * FROM emp 
 WHERE employee_id = 100; Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
  19. 19. 3. Index Skip Scan • SELECT * FROM employees 
 WHERE first_name = ‘Steven’; Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?
  20. 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. 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. 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. 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. 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. 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. 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. 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. 28. Oracle SQL Optimizer’a Güvenin! Sorgudaki WHERE koşuluna indexli kolonu ekledim, index kullanmaya başladı! HAYIR
  29. 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. 30. Bu Sorgu Neden Index Kullanmıyor? • SELECT * FROM employees 
 WHERE salary + 2000 > 22000; ! ! • SELECT * FROM employees 
 WHERE salary > 20000;
  31. 31. Bu Sorgu Neden Index Kullanmıyor? • SELECT * FROM employees
 WHERE last_name LIKE ‘%ing’; ! ! • SELECT * FROM employees
 WHERE last_name LIKE ‘K%';
  32. 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. 33. Indexleri Ne Zaman Rebuild Etmeliyim? • Örnek bir tablo üzerinde bir çok delete, insert yapıldıktan sonra indexlerin durumu: ! ! • Rebuild sonrası durum:
  34. 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.
  35. 35. Dinlediğiniz için Teşekkürler! gokhan@gokhanatil.com gokhanatil www.gokhanatil.com

×