1、配置服务器查询缓存
sys@ORCL> show parameter result_ NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ result_cache_max_result integer 5 result_cache_max_size big integer 2624K result_cache_mode string MANUAL result_cache_remote_expiration integer 0result_cache_max_result :这是一个结果集在缓存中能够使用最大内存的百分比。默认为服务器结果缓存大小的5%。
2、管理服务器结果缓存
从服务器结果缓存中清除查询缓存:
sys@ORCL> exec dbms_result_cache.Flush(); PL/SQL 过程已成功完成。
sys@ORCL> select dbms_result_cache.Status() from dual; DBMS_RESULT_CACHE.STATUS() -------------------------------------------------------------------------------- ENABLED
查看oracle如何为结果缓存分配内存:
sys@ORCL> exec dbms_result_cache.Memory_Report(); R e s u l t C a c h e M e m o r y R e p o r t [Parameters] Block Size = 1K bytes Maximum Cache Size = 2624K bytes (2624 blocks) Maximum Result Size = 131K bytes (131 blocks) [Memory] Total Memory = 9440 bytes [0.003% of the Shared Pool] ... Fixed Memory = 9440 bytes [0.003% of the Shared Pool] ... Dynamic Memory = 0 bytes [0.000% of the Shared Pool] PL/SQL 过程已成功完成。
如果你设置memory_target参数来使用自动内存管理,oracle将会把memory_target的0.25%分配给服务器结果缓存。
如果通过sga_target参数来使用自动内存管理,那么分配的值就是sga_target参数的0.5%。
如果设置shared_pool_size的值来进行手工内存管理,那么将会分配shared_pool_size参数值的1%。
让一个查询结果缓存:
u1@ORCL> select /*+ RESULT_CACHE */ * from emp; 执行计划 ---------------------------------------------------------- Plan hash value: 3956160932 ------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | 18 | 3 (0)| 00:00:01 | | 1 | RESULT CACHE | 6gmh2xmd86mbj974knznuvmy75 | | | | | | 2 | TABLE ACCESS FULL| EMP | 3 | 18 | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------- Result Cache Information (identified by operation id): ------------------------------------------------------ 1 - column-count=2; dependencies=(U1.EMP); name="select /*+ RESULT_CACHE */ * from emp" 统计信息 ---------------------------------------------------------- 0 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 537 bytes sent via SQL*Net to client 416 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 3 rows processed
监控服务器结果缓存统计信息:
u1@ORCL> select * from v$result_cache_statistics; ID NAME VALUE ---------- ------------------------------ ---------- 1 Block Size (Bytes) 1024 2 Block Count Maximum 2624 3 Block Count Current 32 4 Result Size Maximum (Blocks) 131 5 Create Count Success 1 --显示数据库缓存在服务器结果缓存中的查询数目。 6 Create Count Failure 0 7 Find Count 0 8 Invalidation Count 0 --显示数据库清理缓存结果的次数。 9 Delete Count Invalid 0 10 Delete Count Valid 0 11 Hash Chain Length 1 已选择11行。
当result_cache_mode参数设置为MANUAL时,数据库仅将使用查询提示或表注释的查询结果进行缓存。FORCE就是强制所有SQL查询结果都被数据库缓存起来。
要使用查询缓存可以通过查询提示:/*+ RESULT_CACHE */ 或者表注释:
u1@ORCL> select table_name,result_cache from user_tables where table_name='EMP'; TABLE_NAME RESULT_ ------------------------------ ------- EMP DEFAULT u1@ORCL> alter table emp result_cache(mode force); 表已更改。 u1@ORCL> select table_name,result_cache from user_tables where table_name='EMP'; TABLE_NAME RESULT_ ------------------------------ ------- EMP FORCE
u1@ORCL> show parameter client_ NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ client_result_cache_lag big integer 3000 client_result_cache_size big integer 0