很多Oracle的专家都不知道,Oracle在数据缓冲区里有一个查看表。虽然Oracle最初开发V$BH查看表的时候把它用于Oracle平行服务器(Oracle Parallel Server,OPS),但是你也可以用V$BH查看表来显示数据库里每个对象类型的数据缓冲区里数据块的数量。
这个查询让人尤其兴奋,因为你现在可以知道哪些对象正在消耗数据缓冲区。在Oracle9i里,你可以使用这一信息来隔离表格,以便用不同的块大小来分隔RAM缓冲区。
下面是一个示例查询,它显示了数据库里每个对象对数据缓冲区的使用情况。要注意,这个脚本使用了一个Oracle9i标量子查询,而它在Oracle9i之前的系统里是无法使用的,除非你注释掉c3这个列。
column c0 heading 'Owner' format a15
column c1 heading 'Object|Name' format a30
column c2 heading 'Number|of|Buffers' format 999,999
column c3 heading 'Percentage|ofData|Buffer' format 999,999,999
select
owner c0,
object_name c1,
count(1) c2,
(count(1)/(select count(*) from v$bh)) *100 c3
from
dba_objects o,
v$bh bh
where
o.object_id = bh.objd
and
o.owner not in ('SYS','SYSTEM','AURORA$JIS$UTILITY$')
group by
owner,
object_name
order by
count(1) desc
;
下面是一个来自Oracle Financials数据库的一个真实列表。我们很容易就可以看到数据缓冲区里最常用的表格,以及它们所消耗的内存量。在规划Oracle9i里的多数据缓冲池的时候,这就是无价的信息。
Number
Object of
Owner Name Buffers
--------------- ------------------------------ --------
INV MTL_SYSTEM_ITEMS 7,098
WIP WIP_TRANSACTION_ACCOUNTS_N1 6,583
PERFSTAT STATS$ERROR_LOG 5,635
OE SO_LINES_ALL 5,091
OE SO_LINES_ALL 5,091
INV MTL_DEMAND 4,924
INV MTL_ITEM_CATEGORIES 3,098
MRP MRP_FORECAST_DATES 2,248
本文作者: Donald Burleson做数据库管理员已经有23年了,曾经写过14本关于数据库的书和超过100篇的文章。他是《Oracle内幕(Oracle Internals)》的主编,并经营着Burleson Oracle咨询公司(Burleson Oracle Consulting)。