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.
![]()
