Oracle veritabanlarındaki indeks kalitesi

9 May by Ahmet Duruöz

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.

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir