技术开发 频道

RECYCLE池的CACHE特点(二)

SQL> SELECT COUNT(*) FROM T3; COUNT(*) ---------- 167011 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 4839 consistent gets 4829 physical reads 0 redo size 381 bytes sent via SQL*Net to client 503 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed SQL> SELECT OBJECT_NAME, A.STATUS, COUNT(*) 2 FROM V$BH A, USER_OBJECTS B 3 WHERE A.OBJD = B.OBJECT_ID 4 AND OBJECT_NAME IN ('T', 'T2', 'T3') 5 GROUP BY OBJECT_NAME, A.STATUS; OBJECT_NAME STATU COUNT(*) ------------------------------ ----- ---------- T xcur 8078 T2 xcur 1 T3 xcur 17
在把T3表也放入到缓存中,同样Oracle发现T3没有在缓冲中,因此替换了最后进入到缓冲区的T216BLOCK,并替换了T表最后被缓存的一个BLOCK

Oracle这里之所以没有将T2表全部替换出去,就是为了在缓存中保留一份曾经进入过缓存的表的记录。而1BLOCK是最小的保留数据。

    回忆上一篇文章第一个例子中,T表的1BLOCK始终没有被替换出去就是这个原因。
SQL> SELECT COUNT(*) FROM T3; COUNT(*) ---------- 167011 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 4839 consistent gets 4828 physical reads 0 redo size 381 bytes sent via SQL*Net to client 503 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed SQL> SELECT OBJECT_NAME, A.STATUS, COUNT(*) 2 FROM V$BH A, USER_OBJECTS B 3 WHERE A.OBJD = B.OBJECT_ID 4 AND OBJECT_NAME IN ('T', 'T2', 'T3') 5 GROUP BY OBJECT_NAME, A.STATUS; OBJECT_NAME STATU COUNT(*) ------------------------------ ----- ---------- T xcur 8078 T2 xcur 1 T3 xcur 17
再次执行T3的扫描,发现T3的物理读是4828,在第一篇文章中已经知道,T3一共有4829BLOCK,也就是说,这里只有第一个BLOCK被缓存。那么多出来的16BLOCK是怎么产生的呢。
SQL> SHOW PARAMETER DB_FILE_MULTIBLOCK NAME TYPE VALUE ------------------------------------ ----------- --------------------- db_file_multiblock_read_count integer 16
由于初始化参数DB_FILE_MULTIBLOCK_READ_COUNT16,因此,Oracle全表扫描的时候每次读取16BLOCK。这16BLOCK被用于存放每次读取的数据,来加速全表扫描的完成,因此这16BLOCK应该是每次都被新的BLOCK替换出去。

简单总结一下:对于RECYCLE池,先装载的表保留在RECYCLE池中。RECYCLE池满了之后,读取的数据不被缓存。读取没有进入过RECYCLE池的表,会替换掉最后进入RECYCLE池的很少的BLOCK,而且,缓存的BLOCK也可能会很快被替换出去,但是最少会保留1BLOCK在缓存中。
0
相关文章