Oracle 文档在 11.2 Performance Tuning Guide 中有一节,标题为Determining which Segments have many Buffers in the Pool。该部分列出了以下查询:
SELECT o.OBJECT_NAME, COUNT(*) NUMBER_OF_BLOCKS
FROM DBA_OBJECTS o, V$BH bh
WHERE o.DATA_OBJECT_ID = bh.OBJD AND o.OWNER != 'SYS'
GROUP BY o.OBJECT_NAME
ORDER BY COUNT(*);
如果我们将其更改为右连接,我们会从 v$bh 中获取行,而不管 dba_objects 中是否存在匹配的 object_id。
SELECT o.OBJECT_NAME, COUNT(*) NUMBER_OF_BLOCKS
FROM DBA_OBJECTS o, V$BH bh
WHERE o.DATA_OBJECT_ID(+) = bh.OBJD AND o.DATA_OBJECT_ID IS NULL
GROUP BY o.OBJECT_NAME
ORDER BY COUNT(*);
我的问题是这些行代表什么?它们有 file#、block# 和 objd 列,但 dba_objects 中不存在 objd 值。我转储了其中一个块,它似乎包含一个索引,但我无法说出任何关于它的信息。v$bh 中有很多行匹配 dba_objects 中的索引,因此不匹配的 v$bh 行不能因为它们是索引块而不匹配。一定有别的事情发生。
我的一个系统上有更多不匹配的对象,但它们都有不匹配的对象,包括 11.2.0.2.6 系统。
更新:
对于不匹配对象最多的系统,在将 bh.objd 与 obj$ 中的 dataobj# 字段进行比较时,可以匹配大部分。我不确定为什么这些对象没有反映在 dba_objects 中,但也许对视图的检查(或单独的问题)会回答这个问题。
对于剩余的 391 个未识别条目,这里是一些其他感兴趣的信息。
SELECT class#, count(class#) FROM v$bh bh
WHERE NOT EXISTS (SELECT 1 FROM obj$ o2 WHERE o2.dataobj# = bh.objd)
GROUP BY class#
4 HAVING count(class#) > 1;
CLASS# COUNT(CLASS#)
---------- -------------
12 59
13 36
18 15
20 20
22 25
30 12
32 6
36 28
38 3
42 16
44 125
CLASS# COUNT(CLASS#)
---------- -------------
52 4
12 rows selected.
我只用一个条目消除了类值。其中有33个。
SELECT status, count(status) FROM v$bh bh
WHERE NOT EXISTS (SELECT 1 FROM obj$ o2 WHERE o2.dataobj# = bh.objd)
GROUP BY status;
STATUS COUNT(STATUS)
------- -------------
xcur 361
1 row selected.
大多数不匹配的对象将被撤消。
您可以加入
v$bh
以DBA_ROLLBACK_SEGS
识别所涉及的撤消段。