概述

前面已经用实验引入了Oracle 11g的Result Cache概念,以及对Oracle 11g的Result Cache的深层原理做了相关介绍,今天主要介绍其中的视图、工具包、限制条件等。


Result Cache相关视图

Result Cache功能对应了一些视图对象,用来辅助观察Cache中的对象和信息。

SQL> select * from dictionary where table_name like '%RESULT_CACHE%'; --视图v$result_cache_objects可以查看当前result cache中存在的对象信息。 SQL> select id, type, status, name, cache_id from v$result_cache_objects;

查看表结构细节oracle(一文了解Oracle11g的ResultCache--视图)(1)

Oracle为每一个真正存在的Result Cache分配一个Cache ID编号。通过视图v$result_cache_objects可以监控当前的对象状态、信息以及依赖关系。

V$result_cache_dependency是描述缓存数据集合和依赖对象关系的视图。Result Cache中,一个很大的问题就是如何让缓存及时反馈数据的变化。Oracle采用了对象依赖的机制,一旦对象发生了变化,依赖他的Cache就失效不可用。

SQL> select * from v$result_cache_dependency;

查看表结构细节oracle(一文了解Oracle11g的ResultCache--视图)(2)

借助v$result_cache_dependency视图,我们可以看到对象之间的依赖关系,其中的ID是缓存中的ID编号。

在内存SGA中,Oracle分配对象都是以Chunk为单位进行的。视图v$result_cache_memory从内存分配角度,看对象信息缓存的情况。

SQL> select * from v$result_cache_memory;

查看表结构细节oracle(一文了解Oracle11g的ResultCache--视图)(3)

最后是v$result_cache_statistics,计算统计了数据汇总信息。

SQL> select * from v$result_cache_statistics;

查看表结构细节oracle(一文了解Oracle11g的ResultCache--视图)(4)


DBMS_RESULT_CACHE工具包

Oracle为了提供result cache的管理,提供了dbms_result_cache工具包,其中的一些方法,可以帮助我们解决实际中的很多cache问题。

SQL> select dbms_result_cache.Status from dual; --其中清理cache和report cache信息比较有用。 SQL> set serveroutput on size 10000; SQL> exec dbms_result_cache.Memory_Report; --清除result cache SQL> exec dbms_result_cache.Flush; SQL> select id, type, status, name, cache_id from v$result_cache_objects;

查看表结构细节oracle(一文了解Oracle11g的ResultCache--视图)(5)


Result Cache的一些限制

首先,临时表和SYS/system用户下的数据表是不支持result cache的。

SQL> create table t as select * from dba_objects; SQL> show user; SQL> select /* result_cache*/count(*) from t; SQL> select id, type, status, name, cache_id from v$result_cache_objects; SQL> select /* result_cache*/count(*) from scott.dept; SQL> select id, type, status, name, cache_id from v$result_cache_objects;

查看表结构细节oracle(一文了解Oracle11g的ResultCache--视图)(6)

非sys/system对象的数据表才能使用result cache特性。

其次,就是SQL语句中不能包括非确定性的语句和非确定性函数。比如,如果包括sequence对象的nextval和curval,或者sysdate这类的函数,就不能使用result cache。


到这里关于result cache的内容就介绍完了,后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

查看表结构细节oracle(一文了解Oracle11g的ResultCache--视图)(7)

,