Oracle veritabanlarındaki indeks kalitesi
İndeks kalitesi , tüm veritabanı performansını doğrudan etkileyen bir unsurdur. Bir indeksin kalitesi clustering_factor/num_rows oranıyla ölçülür. Bu oran, indeksin sorgudaki kullanımıyla direkt olarak ilgilidir. İndeks kalitesi kötü ise sorgu , tabloda full table scan yapmasına sebep olacaktır.
Clustering factor , temel alınan tabloya göre bir indeksin sıralılığının bir ölçüsüdür. Bir indeks erişimini takip eden bir tablo arama maliyetini kontrol etmek için kullanılır. Clustering factor, dizini tararken okunacak blok sayısını kaydeder. DBA_INDEXES , USER_INDEXES ve ALL_INDEXES görüntülerindeki CLUSTERING_FACTOR kolonunda yer alan clustering factor değeri aşağıdaki işlemler ile belirlenir.
- İndeks sırayla taranır
- ROWID’nin geçerli endeksli değer tarafından işaret edilen blok kısmı, önceki endekslenmiş değer ile karşılaştırılır.
- ROWID’ler farklı tablo bloklarına işaret ediyorsa, clustering factor değeri artırılır.
İndeksin kalitesinin kötü olması durumunda eğer indeks fragmente olmuş ise rebuild diğer durumlarda ise ilgili indeksin drop edilmesi ve sorgu performansının gözlemlenmesi gerekmektedir.
Bir şemadaki indekslerin kalitesini aşağıdaki sorgu ile öğrenebiliriz.
SELECT i.table_name, t.num_rows, t.blocks, i.index_name, o.bytes / 1048576 mb, i.avg_data_blocks_per_key, i.avg_leaf_blocks_per_key, i.clustering_factor, CASE WHEN NVL (i.clustering_factor, 0) = 0 THEN '0-istatistik yok' WHEN NVL (t.num_rows, 0) = 0 THEN '0-istatistik yok' WHEN (ROUND (i.clustering_factor / t.num_rows * 100)) < 6 THEN '5-mukemmel' WHEN (ROUND (i.clustering_factor / t.num_rows * 100)) BETWEEN 7 AND 11 THEN '4-cok iyi' WHEN (ROUND (i.clustering_factor / t.num_rows * 100)) BETWEEN 12 AND 15 THEN '2-iyi' WHEN (ROUND (i.clustering_factor / t.num_rows * 100)) BETWEEN 16 AND 25 THEN '2-Orta' ELSE '1-zayif' END index_quality FROM dba_indexes i, dba_segments o, dba_tables t WHERE i.owner = t.owner AND i.table_name = t.table_name AND i.owner = o.owner AND i.index_name = o.segment_name AND t.owner = UPPER ('&KULLANICI') ORDER BY table_name, num_rows, blocks, index_quality DESC;
İndekslerin kalitesine göre rebuild yada drop yapılarak veritabanı genel performansı olumlu yönde değiştirilebilir.