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.
- 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