§1 Oracle 查询数据缓存问题关键字:Oracle、SQL Query Result Cache 、DBMS_RESULT_CACHE读者级别:中级作者:赵元杰   概要:虽然现在的存储的容量每年以倍数增长,但是,存储子系统的 I/O速度...
SELECT /*+ result_cache */ state, sum(order_total)FROM     order_historyWHERE    order_date BETWEEN ’1-JAN-09’ AND ’1-JAN-...
--Oracle 11g 版本:EXECUTE 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...
例 1:显示当前缓存有关的参数:连接到:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Dat...
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Ap...
--查询 v$result_cache_statistics 视图缓存信息SQL> column name format a20SQL> select name, value from v$result_cache_statistics;NAM...
Upcoming SlideShare
Loading in...5
×

A.oracle 查询结果的缓存问题

1,803

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,803
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "A.oracle 查询结果的缓存问题"

  1. 1. §1 Oracle 查询数据缓存问题关键字:Oracle、SQL Query Result Cache 、DBMS_RESULT_CACHE读者级别:中级作者:赵元杰 概要:虽然现在的存储的容量每年以倍数增长,但是,存储子系统的 I/O速度并没有像它的容量那样令人满意, 这样的原因导致对大数据量表进行读取时消耗较长 I/O 时间,而当数据被读到内存后不能持续保存在内存里,以至于我们再次需要这些数据时,不得不重新从磁盘中读取,导至多次重复读取相同的数据。这里介绍基于 Oracle 11g 版本的缓存数据的方法,可解决这个问题。§1.1 将查询结果缓存在内存很重要吗 ? 使用过 Oracle 系统的技术人员都知道,如果一个应用系统在查询过程中,过多的物理读就意味着应用处理的效率很低。导致大量的物理读的主要原因是Oracle 系统在搜索需要的数据块时,在内存无法找到而必须从数据文件读取。如果,处理需要的数据块能在内存找到,当然就省去了物理 I/O 的处理。从而减少整个应用的处理总时间了。§1.2 11g 版本结果缓存的新功能 对于 Oracle 11g 版本来说,有许多弥补过去旧版本的不足的功能,比如我们关心的结果缓存的问题,Oracle 11g 版本可实现在服务器端的结果缓存和客户端的结果的缓存。对于用户来说,最为关心的莫过于服务器端的缓存了。 服务端的缓存可使用两种方法来实现使用, 一个是在查询语句中加提示(/*+result_cache */ )的方法;另外一个是通过内置包(DBMS_RESULT_CACHE)的方法。下面是这两种方法使用介绍:§1.2.1 使用 RESULT_CACHE 提示实现结果缓存 对于编程人员来说, 采用 Oracle 系统的 SQL 语句提示可谓是最方便,Oracle11g 提供 RESULT_CACHE(使用结果缓存)/NO_RESULT_CACHE(不使用结果缓存)来实现提示--Oracle11g 版本:
  2. 2. SELECT /*+ result_cache */ state, sum(order_total)FROM order_historyWHERE order_date BETWEEN ’1-JAN-09’ AND ’1-JAN-10’GROUP BY state;§1.2.2 关于 NO_RESULT_CACHE 提示 如果使用结果缓存功能,Oracle 系统会将数据结构存放在共享池内,如果Oracle 服务器的内存比较小,而某些表已经采用了 Alter Table <table_name>result_cache 的话,会出现只有查询这个<table_name>表,Oracle 会自动启用数据结构缓存方法,这样回答内存被大量结果缓存所占用,所以,可采用NO_RESULT_CACHE 来实现不使用结果缓存的提示--Oracle11g 版本:SELECT /*+ NO_RESULT_CACHE */ prod_id, SUM(amount_sold)FROM salesGROUP BY prod_idORDER BY prod_id;§1.2.3 DBMS_RESULT_CACHE 包的使用DBMS_RESULT_CACHE 可实现在 PL/SQL 中编程使用。这个包有下面的程序:存储过程 功能FLUSH 清除整个结果缓存的内容MEMORY_REPORT 列出结果缓存内存利用的一个概要(默认)或详细的报表。INVALIDATE 使结果缓存中一个特定对象的缓存结果无效INVALIDATE_OBJECT 根据缓存 ID 使一特定结果缓存无效 返回结果缓存的当前状态。值包括: ENABLED:结果缓存是激活的STATUS DISABLED:结果缓存是不可用的 BYPASSED:结果缓存暂时不可用 SYNC:结果缓存是可用的,但是目前正与其他 RAC 节点重新同步下面例子表示绕过缓存的机制功能:--Oracle11g 版本:SQL> execute dbms_result_cache.bypass(bypass_mode => TRUE, session => TRUE);PL/SQL procedure successfully completed下面例子列出目前内存中缓存的情况信息:
  3. 3. --Oracle 11g 版本:EXECUTE 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 = 1024 bytesMaximum Cache Size = 950272 bytes (928 blocks)Maximum Result Size = 47104 bytes (46 blocks)[Memory]Total Memory = 46340 bytes [0.048% of the Shared Pool]... Fixed Memory = 10696 bytes [0.011% of the Shared Pool]... State Object Pool = 2852 bytes [0.003% of the Shared Pool]... Cache Memory = 32792 bytes (32 blocks) [0.034% of the Shared Pool]....... Unused Memory = 30 blocks....... Used Memory = 2 blocks........... Dependencies = 1 blocks........... Results = 1 blocks............... SQL = 1 blocksPL/SQL procedure successfully completed.§1.3 结果缓存的管理与监控§1.3.1 有关缓存参数与调整对于 Oracle 11g 服务器结果缓存来说,Oracle 系统提供下面参数供 DBA 调整:1.RESULT_CACHE_MODE 参数:这个参数的可能值为:  MANUAL (default) – 查询提示或表注释  FORCE – 每个结果都缓存(不推荐)  AUTO– 更多的选择2.RESULT_CACHE_MAX_SIZE 参数:这个参数表示使用结果缓存的最大值,可能为:  分配给 server result cache 的总数  0 (Disabled), 0.25% (memory_target), 0.5% (sga_target) 及 ~1% (shared_pool_size)3.RESULT_CACHE_MAX_RESULT 参数: 这个参数的含义是:  分配给单个结果集的总数  5% (Default)
  4. 4. 例 1:显示当前缓存有关的参数:连接到:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> show parameter RESULT_CACHENAME TYPE VALUE------------------------------------ ----------- ------------------------------client_result_cache_lag big integer 3000client_result_cache_size big integer 0result_cache_max_result integer 5result_cache_max_size big integer 3168Kresult_cache_mode string MANUALresult_cache_remote_expiration integer 0SQL>例 2:显示哪些缓存参数可以用 ALTER SESSION 修改:SQL> list 1 select name,isses_modifiable from v$parameter where 2* name like res%NAME ISSES-------------------------------------------- -----resource_limit FALSEresource_manager_cpu_allocation FALSEresource_manager_plan FALSEresumable_timeout TRUEresult_cache_mode TRUEresult_cache_max_size FALSEresult_cache_max_result FALSEresult_cache_remote_expiration TRUE已选择 8 行。如果 isses_modifiable 列的值为 TRUE,表示可用 ALTER SESSION 修改。例 3:修改缓存参数:连接到:
  5. 5. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL>SQL> ALTER SYSTEM SET result_cache_max_size = 20M SCOPE = MEMORY;System altered.SQL> SELECT name, value 2 FROM v$parameter 3 WHERE name = result_cache_max_size;§1.3.2 缓存的监控对于 Oracle 11g 服务器结果缓存来说,Oracle 系统提供下面参数供 DBA 调整: 视图 描述 V$RESULT_CACHE_STATISTICS 罗列出各种缓存设置和内存使用统计数据。 V$RESULT_CACHE_MEMORY 列出所有的内存块和相应的统计信息。 V$RESULT_CACHE_OBJECTS 列出所有的对象(缓存的结果和依赖的对象)和它们的属 性。 V$RESULT_CACHE_DEPENDEN 列出缓存的结果和依赖对象间的依赖详情。 CY例 1:查询 v$result_cache_statistics 视图缓存信息:SQL> column name format a20SQL> select name, value from v$result_cache_statistics;NAME VALUE---------------------------- ----------Block Size (Bytes) 1024Block Count Maximum 3136Block Count Current 32Result Size Maximum (Blocks) 156Create Count Success 2Create Count Failure 0Find Count 0Invalidation Count 0Delete Count Invalid 0Delete Count Valid 0例 2:查询缓存情况统计视图:
  6. 6. --查询 v$result_cache_statistics 视图缓存信息SQL> column name format a20SQL> select name, value from v$result_cache_statistics;NAME VALUE---------------------------- ----------Block Size (Bytes) 1024Block Count Maximum 3136Block Count Current 32Result Size Maximum (Blocks) 156Create Count Success 2Create Count Failure 0Find Count 0Invalidation Count 0Delete Count Invalid 0Delete Count Valid 0§1.4 小结 Oracle 系统提供的缓存可实现将查询结果缓存在内存里,但是,任何事情都具有两面性,对于服务器缓存结果集来说,主要控制整个 Oracle 缓存数据的量,即合理的将哪些使用重复频率高的数据是无可非议的。如果数据结构缓存功能被过分使用,会导致整个数据库服务器的内存减少,最后可能走向反面。所以建议 DBA 经常监控这样的功能的使用是否出现过度现象。

×