v$bh & v$cache 测试
v$bh 和 v$cache 视图,可以查询 buffer cache中缓存的数据块,其中包括脏数据块以及为读一致性构造的cr 块.
本测试就是通过这2个视图,查证oracle 构造的过程.
首先登录数据库,读取test表。
sql>conn zhumz
sql> select * from test;
然后,查询该表的 object_id
sqlplus "/ as sysdba"
SQL> select * from dba_objects where wner='ZHUMZ' and object_type='TABLE' and object_name='TEST';
OWNER OBJECT_NAME OBJECT_ID OBJECT_TYPE
------------------------------ --------------------- ---------- ------------------
ZHUMZ TEST 7477 TABLE
查询 v$bh ,查看 zhumz 读取到 buffer_cache 中的 block
QL> select * from v$bh where bjd=7477;
FILE# BLOCK# CLASS# STATUS XNC DIRTY TEMP PING STALE DIRECT NEW OBJD TS#
---------- ---------- ---------- ------ ---------- ----- ---- ---- ----- ------ --- ---------- ----------
1 1489 4 xcur 0 N N N N N N 7477 0
1 1490 1 xcur 0 N N N N N N 7477 0
通过 v$cache 查看
SQL> select * from v$cache where file#=1 and block# in (1489,1490);
FILE# BLOCK# CLASS# STATUS XNC NAME KIND OWNER#
---------- ---------- ---------- ------ ---------- ------------- -----------------
1 1489 4 xcur 0 TEST TABLE 52
1 1490 1 xcur 0 TEST TABLE 52
SQL> select * from v$cache where owner# = (select user_id from dba_users where username='ZHUMZ');
FILE# BLOCK# CLASS# STATUS XNC NAME KIND OWNER#
---------- ---------- ---------- ------ ---------- -------------------------- ----------
1 1489 4 xcur 0 TEST TABLE 52
1 1490 1 xcur 0 TEST TABLE 52
这时如果zhumz更新这个表:
sql> update test set name='jeny' where id=2;
可以从 v$bh 的 DIRTY 列,查出变脏的数据块
sqlplus "/ as sysdba"
SQL> select * from v$bh where bjd=7477;
FILE# BLOCK# CLASS# STATUS XNC DIRTY TEMP PING STALE DIRECT NEW OBJD TS#
---------- ---------- ---------- ------ ---------- ----- ---- ---- ----- ------ --- ---------- ----------
1 1489 4 xcur 0 N N N N N N 7477 0
1 1490 1 xcur 0 Y N N N
注意对 status 列来说,buffer cache 里的数据状态是 xcur.,因此这个状态是特定的block针对特定的进程而言的。
这时如果zhumz的另外一个进程,读取 test 表, 以上查询可以看出:
SQL> /
FILE# BLOCK# CLASS# STATUS DIRTY TEMP PING STALE DIRECT NEW OBJD TS#
---------- ---------- ---------- ------ ----- ---- ---- ----- ------ --- ---------- ----------
1 1489 4 xcur N N N N N N 7477 0
1 1490 1 cr Y N N N N N 7477 0
1 1490 1 xcur Y N N N N N 7477 0
多了一行,系统为这个新进程构造了 cr (一致性读) block.
附记:
v$cache 单实例数据库默认不会创建,需要自行创建。
创建脚本: ?\rdbms\admin\catclust.sql
测试环境:
os: windowsxp db: oracle9204
本测试就是通过这2个视图,查证oracle 构造的过程.
首先登录数据库,读取test表。
sql>conn zhumz
sql> select * from test;
然后,查询该表的 object_id
sqlplus "/ as sysdba"
SQL> select * from dba_objects where wner='ZHUMZ' and object_type='TABLE' and object_name='TEST';
OWNER OBJECT_NAME OBJECT_ID OBJECT_TYPE
------------------------------ --------------------- ---------- ------------------
ZHUMZ TEST 7477 TABLE
查询 v$bh ,查看 zhumz 读取到 buffer_cache 中的 block
QL> select * from v$bh where bjd=7477;
FILE# BLOCK# CLASS# STATUS XNC DIRTY TEMP PING STALE DIRECT NEW OBJD TS#
---------- ---------- ---------- ------ ---------- ----- ---- ---- ----- ------ --- ---------- ----------
1 1489 4 xcur 0 N N N N N N 7477 0
1 1490 1 xcur 0 N N N N N N 7477 0
通过 v$cache 查看
SQL> select * from v$cache where file#=1 and block# in (1489,1490);
FILE# BLOCK# CLASS# STATUS XNC NAME KIND OWNER#
---------- ---------- ---------- ------ ---------- ------------- -----------------
1 1489 4 xcur 0 TEST TABLE 52
1 1490 1 xcur 0 TEST TABLE 52
SQL> select * from v$cache where owner# = (select user_id from dba_users where username='ZHUMZ');
FILE# BLOCK# CLASS# STATUS XNC NAME KIND OWNER#
---------- ---------- ---------- ------ ---------- -------------------------- ----------
1 1489 4 xcur 0 TEST TABLE 52
1 1490 1 xcur 0 TEST TABLE 52
这时如果zhumz更新这个表:
sql> update test set name='jeny' where id=2;
可以从 v$bh 的 DIRTY 列,查出变脏的数据块
sqlplus "/ as sysdba"
SQL> select * from v$bh where bjd=7477;
FILE# BLOCK# CLASS# STATUS XNC DIRTY TEMP PING STALE DIRECT NEW OBJD TS#
---------- ---------- ---------- ------ ---------- ----- ---- ---- ----- ------ --- ---------- ----------
1 1489 4 xcur 0 N N N N N N 7477 0
1 1490 1 xcur 0 Y N N N
注意对 status 列来说,buffer cache 里的数据状态是 xcur.,因此这个状态是特定的block针对特定的进程而言的。
这时如果zhumz的另外一个进程,读取 test 表, 以上查询可以看出:
SQL> /
FILE# BLOCK# CLASS# STATUS DIRTY TEMP PING STALE DIRECT NEW OBJD TS#
---------- ---------- ---------- ------ ----- ---- ---- ----- ------ --- ---------- ----------
1 1489 4 xcur N N N N N N 7477 0
1 1490 1 cr Y N N N N N 7477 0
1 1490 1 xcur Y N N N N N 7477 0
多了一行,系统为这个新进程构造了 cr (一致性读) block.
附记:
v$cache 单实例数据库默认不会创建,需要自行创建。
创建脚本: ?\rdbms\admin\catclust.sql
测试环境:
os: windowsxp db: oracle9204
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/72624/viewspace-606984/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/72624/viewspace-606984/