oracle 一些命中率

oracle 一些命中率

  (2012-03-30 08:58:18)
标签: 

杂谈

 

physical reads > "physical reads direct + physical reads cache"

Total number of data blocks read from disk.
This value can be greater than the value of "physical reads direct" plus "physical reads cache" as reads into process private buffers also included in this statistic

physical reads direct

Number of reads directly from disk, bypassing the buffer cache.
For example, in high bandwidth, data-intensive operations such as parallel query, reads of disk blocks bypass the buffer cache to maximize transfer rates and to prevent the premature aging of shared data blocks resident in the buffer cache.

physical reads cache
Total number of data blocks read from disk into the buffer cache. This is a subset of "physical reads" statistic.

session logical reads = "db block gets" + "consistent gets".

逻辑读 = 一致读 + db block gets
物理读是内容不在内存中,要去硬盘中读入内存 增加IO
逻辑读内容在内存中,不需要读硬盘 无IO

consistent gets:来自buffer cache + undo(如果有数据改变的话,即在查询点之前的DML操作没有提交)
db_block_gets:来自buffer cache

DB Block Gets:请求的数据块在buffer能满足的个数
Consistent Gets:数据请求在回滚段Buffer中的总数
逻辑读 = 一致读 + DB Block Gets

逻辑读就是从内存在读取的数据块数,物理读就是从硬盘读取到缓冲区的数据块数。

The sum of "db block gets" plus "consistent gets".This includes logical reads of database blocks from either the buffer cache or process private memory.

db block gets
Number of times a CURRENT block was requested

consistent gets 
Number of times a consistent read was requested for a block.
See Also: "consistent changes" and "session logical reads" statistics

consistent changes
Number of times a user process has applied rollback entries to perform a consistent read on the block
Work loads that produce a great deal of consistent changes can consume a great deal of resources. The value of this statistic should be small in relation to the "consistent gets" statistic.

Physical Reads:从磁盘读到Buffer cache数据块的数量

物理读是由于在DB_BLOCK_BUFFER中没有找到需要的数据,需要进行缓冲区的数据置换,物理读操作是非常消耗系统资源的,应当尽量避免。

DB Bocks gets,Consistent gets And Physical reads
通过前面关于索引扫描还是全表扫描(Index Scan Or Full Table Scan)?的讨论又发现了自己基础概念不清晰的一个大问题:
DB block gets,Consistent gets,Physical reads与Logical reads各自具体表示的是什么以及之间的的关系到底是怎样。

官方在线文档基本的定义为如下:
DB block gets:the number of accesses to the current image of a block
Consistent gets:the number of accesses to a read-consistent image of a block
Physical reads:the number of blocks read from disk

通过官方的简要解释加上对fenng和旺旺的请教以及网上搜索了一些资料,终于加深了一些理解:

这其中主要涉及到了Oracle读取数据的consistent mode和current mode这两个模式,对于db block gets是在current mode下读取的block数目(单位应该是“块次”,同一个block读取了两个算做2),而consistent gets是在consistent mode下读取的block数目(单位同上)。
current mode下读取数据是为了保证读取到的数据是当前时间点上最新的数据,这样做的目的一般都是为了DML语句的需求,比如需要更新,自然需要知道最新的数据才行;consistent mode呢主要是为了保证Oracle数据一致读的特性,一般都是在select情况下发生,读到的数据可能是一个实际存在的block,也有可能需要根据scn信息以及transaction相关信息以及回滚段中数据来构造。

而physical reads是与logical reads相对的一个概念,两者的区别是读取的数据是从buffer中读取到还是从disk上的db file中取到。通过v$sysstat也可以看到,里面还有db block gets from cache以及consistent gets from cache两项,且这两项的数值与db block gets和consistent gets并不相同且小于后两者。

所以不管是db block gets还是consistent gets,都可能出现了physical reads和logical reads两种情况(由buffer中的是否已经存在需要的数据),也即是说,db block gets与consistent gets两者已经构成了一次数据库操作中读取的所有block的总次数了。因此,logical reads自然也就可以通过如下公式算的:logical reads = (db block gets + consistent gets) - physical reads。

由此,自然也就得出了cache命中率的公式:
Hit Ratio = (db block gets + consistent gets - physical reads) / (db block gets + consistent gets)
OR
Hit Ratio = 1 – (physical reads/(db block gets + consistent gets))

PS:
由于在Oracle中,取数据最后都是从Buffer中取,所以每出现一个physical reads必然会出现一次 logical reads,但是这里有一个需要注意的地方,就是当出现一个physical reads后接着会有一个logical reads这里,实际上这里只算了1 block(physical reads)!所以也可以說logical reads = db block gets + consistent gets ??

一致读是由于需要读取的数据已经被锁定或修改,需要从回滚段的缓冲区中读取,一致读保证了数据一致性,但是大量的一致读说明系统设计或内存配置出现了问题,也是需要特别注意的。

DB Block Gets是指用户请求而且又恰好在DB_BLOCK_BUFFER中的数据量,对于一个良好的系统,绝大部分都就应当是这种情况。

逻辑读 = 一致读 + DB Block Gets 逻辑读就是从内存在读取的数据块数,物理读就是从硬盘读取到缓冲区的数据块数。


 

 

 

oracle常用命中率的查詢:

 

---DB buffer 命中率統計

select round((1 - (physical.value - direct.value - lobs.value)/logical.value)*100,2) "Buffer Cache Hit Ratio"
from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logical
where physical.name ='physical reads'
  and direct.name ='physical reads direct'
  and lobs.name ='physical reads direct (lob)'
  and logical.name ='session logical reads';
 
 或者
select round((1 - (physical.value - direct.value - lobs.value)/(blocks.value+consistentgets.value))*100,2) "Buffer Cache Hit Ratio"
from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat blocks,v$sysstat consistentgets
where physical.name ='physical reads'
  and direct.name ='physical reads direct'
  and lobs.name ='physical reads direct (lob)'
  and blocks.name='db block gets'
  and consistentgets.name='consistent gets';

 

或者

SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,
1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio"
FROM V$BUFFER_POOL_STATISTICS WHERE NAME='DEFAULT';

 

 

--Library Hit
select round(sum(pinhits)/sum(pins)*100,2) "Library Hit(%)"
from v$librarycache;

--Latch Hit
select round((1-sum(misses)/sum(gets))*100,2) "Latch Hit(%)"
from v$latch;

 

 

Library Hit,主要代表着sql在共享区的命中率,通常在98%以上。
Latch Hit,内部结构维护锁命中率,高于99%,通常低是因为shared_pool_size过大和没有使用绑定变量导致硬解析过多。
Buffer Hit,数据块在数据缓冲区中的命中率,通常应该在90%以上,否则加大db_cache_size。

 

 

 

 

 

更多相關信息請參考  http://www.51testing.com/html/50/n-243650.html

http://hi.baidu.com/dba_james/blog/item/79e7443fea1f863a71cf6c6b.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值