Pages

20 Aralık 2010 Pazartesi

Oracle 9i buffer cache(ön bellek) içindeki objeler

Oracle üzerinde sys kullanıcısı ile oturum açıldığı zaman erişilen v$bh görünümü data buffer içeriği ile birlikte bufferdaki her segment tipine ait blok sayısını göstermektedir.

V$bh görünümü özellikle veritabanında multiple data buffer poollardaki tablo ve index belelkleme(caching)değerlerini görmek için kullanışlıdır.Örneğin, geniş blok boyutunda ayrı index bufferlara sahip olmak Oracle index yapısını iyileştirmektedir. v$bh görünümü aynı zamanda optimizer_index_caching parametresi için olması gereken optimal değeride bizlere verebilmektedir. Bu sayede buffer cachede veritabanındaki ne kadar indexin buffer cachede bulundurulacağı garanti edilir.

Günümüzde pek çok Oracle uzmanı db_cache_size ile segmentleme yaparken db_2k_cache_size, db_4k_cache_size, db_8k_cache_size, db_16k_cache_size parameterleri yardımıylada farklı data bufferlar oluşturarak data bloklarının belleklemesini izole ederler ve böylece bellekleme ve yönetim performans değerlerini iyileştirirler.

v$bh görünümünün dba_objects ve dba_segments görünümleri ile birleşimi data buffer içeriğini blok blok listeleyebilir ve bufferın tablo ve indexlerini ne kadar iyi bellekleyebildiğini gösterir. Oracle 9i üzerinde data buffer boyutları dinamik olarak değiştirilebildiğinden beri bu durum önem kazanmaktadır.

Data objelerini RAM bufferde adresleme için script yazarken bir takım data dictionary ipuçları vardır:

  • Duplike object isimleri: dba_objects ile dba_segments görünümlerini birleştirirken name, type ve owner kolonları objeyi yeterince ayrıştırmada gerekli kolonlardır.
  • Multiple block boyutları: Farklı blok boyutundaki objeleri görmek için objenin blok boyutunu görmemiz gerekmektedir. Bunun için, blokları byte değerlerine bölerek blok boyutunu dba_segments görünümünden hesaplayabiliriz.
  • Partitionlar: Standart equi-join ile belirli obje için her obje partitionu her segment partitionu ile birleşebilir.Böylece, alttaki sorgu bölümü, partitionlaşmış objeleri ele almakta kullanılabilir.
            and nvl(t1.subobject_name,'*') = nvl(s.partition_name,'*')
  • Clusterlar: Clusterlar v$bh nin satırı kendi ilişkisel veritabanı objesi ile birleşirken bir sorun oluşturur. bh.objd ile object_id yi birleştirmekten ziyade, data_object_id ile birleştirmemiz gereklidir.
  • Çoklu bellekler(multiple caches): Buffer cache de belirli bloğun birden fazla kez belleğe alınmış olabildiği durumlar olabilir. Bu gizemli bir kavramdır, ama altaki inline görünüm ile bu durumun kolayca üstesinden gelinebilir.
          (select distinct objd, file#, block# from v$bh where status != 'free')

Alttaki script data buffer içinde yer alan objeler ile ilgili detaylı analiz yapmakta ve data buffer boyutlarının değişmesi gerektiği durumlarında bizlere hayati kritik bilgiler ve tüyolar vermektedir. Çok önemli bir rapordur, çünkü hem 3 obje tipi(tablolar,indexler ve partitionlar), hemde DEFAULT, KEEP veya RECYCLE olarak sub-setler görünür. Ayrıca, hangi objenin hangi blok boyutunda olduğuda burdan görünmektedir. Bu scripti belirli zamanlarda çalıştırıp sonuçlarını analiz etmek üzere saklamak faydalı olacaktır. Bu sayede, data buffera giren ve çıkan blokları izleyebilir ve hem bu sonuçlara göre bellekte KEEP yada RECYCLE değerlerini optimize etmekte, hemde cache sizelerin değerlerinin gereğinden büyük yada küçük olup olmadığının analizinde kullanabiliriz.

ttitle 'Contents of Data Buffers'
drop table t1;
create table t1 as
select
   o.owner          owner,
   o.object_name    object_name,
   o.subobject_name subobject_name,
   o.object_type    object_type,
   count(distinct file# || block#)         num_blocks
from  dba_objects  o, v$bh         bh
where  o.data_object_id  = bh.objd
and o.owner not in ('SYS','SYSTEM')
and bh.status != 'free'
group by  o.owner, o.object_name, o.subobject_name, o.object_type

order by count(distinct file# || block#) desc;

column c0 heading "Owner"                                    format a12
column c1 heading "Object|Name"                              format a30
column c2 heading "Object|Type"                              format a8
column c3 heading "Number of|Blocks in|Buffer|Cache"         format 99,999,999
column c4 heading "Percentage|of object|blocks in|Buffer"    format 999
column c5 heading "Buffer|Pool"                              format a7
column c6 heading "Block|Size"                               format 99,999

select
   t1.owner   c0,
   object_name   c1,
   case when object_type = 'TABLE PARTITION' then 'TAB PART'
        when object_type = 'INDEX PARTITION' then 'IDX PART'
        else object_type end c2,
   sum(num_blocks)  c3,
   (sum(num_blocks)/greatest(sum(blocks), .001))*100  c4,
   buffer_pool     c5,
   sum(bytes)/sum(blocks)   c6
from t1, dba_segments s
where  s.segment_name = t1.object_name
and s.owner = t1.owner
and s.segment_type = t1.object_type
and nvl(s.partition_name,'-') = nvl(t1.subobject_name,'-')
group by  t1.owner, object_name, object_type, buffer_pool
having  sum(num_blocks) > 10
order by  sum(num_blocks) desc;

0 yorum:

Yorum Gönder