Hi,
In order to improve reading performance of a LOB column in my table, I enable CACHE option for it.
But when I check in the buffer cache using gv$bh (I did some SELECT queries on it so it can be cached), I cannot find any entries for my cached LOB.
SELECT *
FROM gv$bh
WHERE lobid =
(SELECT object_id
FROM dba_lobs lob, dba_objects obj
WHERE lob.table_name = 'MY_TABLE' -- it contains only one lob column, so the returned result is unique
AND lob.SEGMENT_NAME = obj.object_name
AND lob.owner = obj.owner);
Is this the way to go? or I m missing something?
Thanks.
Here's a simple test you can try on your instance
SQL> create table t (pk int, c clob) lob ( c ) store as ( disable storage in row );
Table created.
SQL> insert into t
2 select rownum, rpad(rownum,6000)
3 from dual
4 connect by level <= 1000;
1000 rows created.
SQL> commit;
Commit complete.
SQL> select *
2 from user_lobs
3 where table_name = 'T'
4 @pr
==============================
TABLE_NAME : T
COLUMN_NAME : C
SEGMENT_NAME : SYS_LOB0000196870C00002$$
TABLESPACE_NAME : USERS
INDEX_NAME : SYS_IL0000196870C00002$$
CHUNK : 8192
PCTVERSION :
RETENTION :
FREEPOOLS :
CACHE : NO
LOGGING : YES
ENCRYPT : NO
COMPRESSION : NO
DEDUPLICATION : NO
IN_ROW : NO
FORMAT : ENDIAN NEUTRAL
PARTITIONED : NO
SECUREFILE : YES
SEGMENT_CREATED : YES
RETENTION_TYPE : DEFAULT
RETENTION_VALUE :
VALUE_BASED : NO
MAX_INLINE : 0
PL/SQL procedure successfully completed.
SQL> select object_name, data_object_id
2 from user_objects
3 where object_name in ('T','SYS_LOB0000196870C00002$$','SYS_IL0000196870C00002$$');
OBJECT_NAME DATA_OBJECT_ID
---------------------------------------- --------------
SYS_IL0000196870C00002$$ 196872
SYS_LOB0000196870C00002$$ 196871
T 196870
SQL> select objd, count(*)
2 from v$bh
3 where objd in (
4 196872
5 ,196871
6 ,196870
7 )
8 group by objd;
OBJD COUNT(*)
---------- ----------
196871 108
196872 4
196870 16
SQL> declare
2 v varchar2(8000);
3 begin
4 for x in 1 .. 10
5 loop
6 for i in ( select * from t ) loop
7 v := substr(i.c,2000);
8 end loop;
9 end loop;
10 end;
11 /
PL/SQL procedure successfully completed.
SQL>
SQL> declare
2 v varchar2(8000);
3 begin
4 for x in 1 .. 10
5 loop
6 for i in ( select * from t ) loop
7 v := substr(i.c,2000);
8 end loop;
9 end loop;
10 end;
11 /
PL/SQL procedure successfully completed.
SQL>
SQL> select objd, count(*)
2 from v$bh
3 where objd in (
4 196872
5 ,196871
6 ,196870
7 )
8 group by objd;
OBJD COUNT(*)
---------- ----------
196871 109
196872 4
196870 31
sql> alter table t modify lob (c)(cache);
Table altered.
SQL> declare
2 v varchar2(8000);
3 begin
4 for x in 1 .. 10
5 loop
6 for i in ( select * from t ) loop
7 v := substr(i.c,2000);
8 end loop;
9 end loop;
10 end;
11 /
PL/SQL procedure successfully completed.
SQL>
SQL> select objd, count(*)
2 from v$bh
3 where objd in (
4 196872
5 ,196871
6 ,196870
7 )
8 group by objd;
OBJD COUNT(*)
---------- ----------
196871 2110
196872 5
196870 31
SQL>
SQL>