Top Banner
VERİYE ERİŞİMİN EN HIZLI YOLU: INDEXLER Gökhan Atıl - Senior Oracle DBA
35

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

Feb 18, 2017

Download

Software

Gokhan Atil
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: TROUG & Turkey JUG Semineri: Veriye erişimin en hızlı yolu

VERİYE ERİŞİMİN EN HIZLI YOLU: INDEXLER Gökhan Atıl - Senior Oracle DBA

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

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

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

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ı

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

Index Nedir?

Index Tablo

sıralı

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

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

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

Balanced Tree Index Yapısı

linked list

split & merge

HER ZAMAN

DENGELİ

1

2

3

root

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

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)

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

Ön Hazırlık

Tablomda Hangi Indexler Var?

Sorgum Hangi Indexi Kullanıyor (veya kullan mıyor)?

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

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 cWHERE i.index_name = c.index_name AND i.table_name = ‘EMPLOYEES’ORDER BY i.index_name, c.column_position;

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

Sorgum Hangi Indexi Kullanıyor?

• EXPLAIN PLAN FOR select * from employees where employee_id=100;

• SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

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

Sorgum Hangi Indexi Kullanıyor?

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

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.

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

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.

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

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';

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

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';

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

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);

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

Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?

1. Index Unique Scan

• SELECT * FROM employees WHERE employee_id = 100;

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

2. Index Range Scan

• SELECT * FROM emp WHERE employee_id = 100;

Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?

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

3. Index Skip Scan

• SELECT * FROM employees WHERE first_name = ‘Steven’;

Oracle Indexleri Kullanarak Kayıtlara Nasıl Erişir?

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

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?

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

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?

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

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?

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

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

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

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.

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

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

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

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

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

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!

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

Oracle SQL Optimizer’a Güvenin!

Sorgudaki WHERE koşuluna indexli kolonu ekledim, index

kullanmaya başladı!

HAYIR

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

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;

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

Bu Sorgu Neden Index Kullanmıyor?

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

!

!

• SELECT * FROM employees WHERE salary > 20000;

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

Bu Sorgu Neden Index Kullanmıyor?

• SELECT * FROM employeesWHERE last_name LIKE ‘%ing’;

!

!

• SELECT * FROM employeesWHERE last_name LIKE ‘K%';

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

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.

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

Indexleri Ne Zaman Rebuild Etmeliyim?

• Örnek bir tablo üzerinde bir çok delete, insert yapıldıktan sonra indexlerin durumu:

!

!

• Rebuild sonrası durum:

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

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.

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

Dinlediğiniz için Teşekkürler!

[email protected]

gokhanatil

www.gokhanatil.com