A documentação do Oracle tem uma seção no Guia de Ajuste de Desempenho 11.2 com o título Determinando Quais Segmentos Têm Muitos Buffers no Conjunto . A seção lista a seguinte consulta:
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(*);
Se alterarmos isso para uma junção à direita, obteremos linhas de v$bh, independentemente de haver ou não um object_id correspondente em dba_objects.
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(*);
Minha pergunta é o que essas linhas representam? Eles têm colunas file#, block# e objd, mas os valores objd não existem em dba_objects. Despejei um dos blocos e parecia conter um índice, mas não consegui dizer mais nada sobre isso. Há muitas linhas em v$bh que correspondem a índices em dba_objects, portanto, as linhas v$bh não correspondentes não podem ser não correspondentes apenas porque são blocos de índices. Algo mais deve estar acontecendo.
Existem mais objetos não correspondentes em um dos meus sistemas, mas todos eles têm objetos não correspondentes, incluindo o sistema 11.2.0.2.6.
Atualizar:
Para o sistema com o maior número de objetos sem correspondência, a maioria pode ser correspondida ao comparar o bh.objd com o campo dataobj# de obj$. Não sei por que esses objetos não são refletidos em dba_objects, mas talvez um exame da exibição (ou uma pergunta separada) responda a isso.
Para as 391 entradas não identificadas restantes, aqui estão algumas outras informações de interesse.
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.
Eliminei os valores de classe com apenas uma entrada. Foram 33 deles.
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.
A maioria dos objetos não correspondentes será Desfazer.
Você pode associar
v$bh
paraDBA_ROLLBACK_SEGS
identificar os segmentos de Desfazer envolvidos.