PERFORMANS TUNING-5 OPTIMIZER ACCESS PATH AND INDEXES

Access Path bir veriye veritabanın hangi yoldan erişeceğini ve istenen operasyonun hangi adımlardan oluşturğunun tarifidir diyebiliriz. En basitinden bildiğimiz bir örnek üzerinden açıklarsak, eğer bir tablonun verilerinin tamamına yakın bir bölümüne erişmeye çalışıyorsak Full Table Scan (FTS) en mantıklı ve az maaliyetli erişim yolu olacaktır, fakat tablodan bir satır kayıda erişim yapacaksan index üzerinden erişmek en mantıklı erişim yöntemi olacaktır. Bu gibi erişim yollarını göreceğiz.

  1. FULL TABLE SCAN

Tablodaki tüm rowlar okunur filtre varsa şartları uygulanır, koşula uymayan değerler çıkartılır. Eğer Tablonun çok büyük bir kısmını okuyacak isek FTS kullanabilir, bu durumlarda CBO tarafından index kullanmak daha maliyetli olarak hesaplanabilir, Aşağıdaki durumlarda CBO FTS kullanmayı tercih edecektir.

  • Mecut Indexlerin kullanımını engelleyen bir durum varsa, örneğin sorgunun index kullanılamayacak bir şekilde yazılması filterede fonksiyon kullanılması gibi
  • CBO sorguda tablonun çok büyük bir kısmının okunacağını varsayarsa FTS kullanır
  • Tablo çok küçükse Tabloyu bir I/O da okuyabileceğini düşünürse CBO FTS kullanır.
  • Çok yüksek parallel seviyede sorgu çalıştırılırsa
  • FTS Hinti kullanılırsa /* +FULL (table_name) */

FTS ile veriler okunurken çoklu blok okuma yapılması FTS hızını arttıracaktır, segmenteler extend alarak büyüdükleri ve bu bloklar sequential yanı sıralı olduklarından dolayı, FTS bir okumada bir blok değil 1 ile DB_FILE_MULTIBLOCK_READ_COUNT parametresi arasındaki bir değer kadar block okuyacaktır.

2. ROWID SCAN

ROWID bir satırın bulunduğu yerin fiziksel ID adresidir. Bier satıra ROWID üzerinden erişmekten daha hızlı bir yol yoktur.

INDEX

Indexler ve çeşitleri aşağıdaki gibidir,

  • B-Tree INDEX; Varsayılan index türüdür, uniqe ve düşük selectivity alanlar çok uygundur. B-Tree Index’inde içinde çeiştleri vardır. Adı üzerinde ağaç yapısındadır, küçük büyük şeklinde root dan başlarak leaf lere doğru hızlı bir arama yapar ve sonuca ulaşır. aşağıda https://www.cs.usfca.edu/~galles/visualization/BTree.html
  • Normal B-tree
    • Function Based (Where şartına göre indexleme yöntemidir)
    • Index-Organided Table (IOT): Index yapısındaki tablolardır denebilir. PK ya göre düzenlenmiş B-tree şeklinde ki tablolardır
  • BITMAP INDEX Yüksek selectivity (Cinsiyet, Milliyet vb.) , düşük DML içerien olan tablolar için (DSS) kullanılabilecek bir index türüdür.
  • Cluster INDEX
  • Domain INDEX: Belirli uygulamlar için özel indexlerdir.

INDEX SCAN

  • Unique
  • Range
  • Index Range Scans Descending
  • Index Scip Scans
  • Full & Fast Index Scans
  • Index Join

4. Index Unique Scans

Bu işlemi, en fazla, tek bir rowid döndürür. Oracle, UNIQUE veya PRIMARY KEY alanlarda bir işlem varsa Index Unique Scan gerçekleştirir.

5. Index Range Scan

Sorgunun şartlarını sağlayan birden fazla satır varsa o aralık indexten sıralı bir şekilde taranır ve getirilir.

a. Index Range Scan Descending

Range Scan de veriler default olarak Asc (Küçükten Büyüğe) olarak sıralıdır, Desc olarak (büyükten küçüğe) getirilmesi durumunda kullanılır.

b. Index Range Scan Function Based (Functional Indexes)

Sorgudaki koşul şürekli kullanılması gerekiyorsa bu koşula göre index oluşturmak gerekebilir.

6. Index Full Scan

Tüm index segmentleri okunur ve uygulanan filtreye göre rowid üzerinden tablo kayıtlarına erişim yapılır.

7. Index Fast FUll Scan

Index sorgudaki tüm verileri sağlıyor ise FTS ye alternatif olarak Index Fast Full Scan yani tüm index segmetleri okunur ve aranan veri index üzerinden tabloya gitmeden getirilir. Bunun gerçekleşebilmesi için index içeren kolonlarından en az birinde NOT NULL constraint’ inin olması gerekmektedir.

8. Index Scip Scan

Compozit bir Index var ve sorguda bu compozit indexin ilk kolonunu sorgulamıyorsak, CBO FTS ve Full Index Scan dan daha performaslı bir durum seçerek Index Scip Scan kullanır. Aşağıdaki sorguda Gender ve Age üzerinde Compozit index vardır, sorguda age üzerinde bir aralık sorgulanmaktadır.

INVISIBLE INDEX

Bir Index Invisible duruma getirildiğinde eğer OPTIMIZER_USE_INVISIBLE_INDEXES parametresi TRUE değise (varsayılan FALSE dir) CBO tarafından bu index yok sayılır, bir index drop edilmeden önce invisible yapılarak sistem üzerindeki etkisi gözlenebilir ve daha sonrasında drop etmek production ortamlar için mantıklı bir yaklaşım olacaktır. Index invisible olsada DML ifadelerinde index değişimi devam edecektir.

Bir Indexi Invisible ve Visible yapmak için

SQL> ALTER INDEX ind1 INVISIBLE;

SQL> ALTER INDEX ind1 VISIBLE;

--bir index oluşturukende invisible olarak oluşturulabilir.

SQL> CREATE INDEX IND1 ON TAB1(COL1) INVISIBLE;