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

Post on 18-Feb-2017

488 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

Transcript

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 cWHERE 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 employeesWHERE last_name LIKE ‘%ing’;

!

!

• SELECT * FROM employeesWHERE 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

top related