Upload
wasecurity
View
2.358
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
§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 语句提示可谓是最方便,Oracle
11g 提供 RESULT_CACHE(使用结果缓存)/NO_RESULT_CACHE(不使用结果缓
存)来实现提示
--Oracle11g 版本:
SELECT /*+ result_cache */ state, sum(order_total)
FROM order_history
WHERE 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 sales
GROUP BY prod_id
ORDER BY prod_id;
§1.2.3 DBMS_RESULT_CACHE 包的使用
DBMS_RESULT_CACHE 可实现在 PL/SQL 中编程使用。这个包有下面的程序:
存储过程 功能
FLUSH 清除整个结果缓存的内容
MEMORY_REPORT 列出结果缓存内存利用的一个概要(默认)或详细的报表。
INVALIDATE 使结果缓存中一个特定对象的缓存结果无效
INVALIDATE_OBJECT 根据缓存 ID 使一特定结果缓存无效
STATUS
返回结果缓存的当前状态。值包括:
ENABLED:结果缓存是激活的
DISABLED:结果缓存是不可用的
BYPASSED:结果缓存暂时不可用
SYNC:结果缓存是可用的,但是目前正与其他 RAC 节点重新同步
下面例子表示绕过缓存的机制功能:
--Oracle11g 版本:
SQL> execute dbms_result_cache.bypass(bypass_mode => TRUE, session => TRUE);
PL/SQL procedure successfully completed
下面例子列出目前内存中缓存的情况信息:
--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 bytes
Maximum 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 blocks
PL/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)
例 1:显示当前缓存有关的参数:
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> show parameter RESULT_CACHE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_lag big integer 3000
client_result_cache_size big integer 0
result_cache_max_result integer 5
result_cache_max_size big integer 3168K
result_cache_mode string MANUAL
result_cache_remote_expiration integer 0
SQL>
例 2:显示哪些缓存参数可以用 ALTER SESSION 修改:
SQL> list
1 select name,isses_modifiable from v$parameter where
2* name like 'res%'
NAME ISSES
-------------------------------------------- -----
resource_limit FALSE
resource_manager_cpu_allocation FALSE
resource_manager_plan FALSE
resumable_timeout TRUE
result_cache_mode TRUE
result_cache_max_size FALSE
result_cache_max_result FALSE
result_cache_remote_expiration TRUE
已选择 8 行。
如果 isses_modifiable 列的值为 TRUE,表示可用 ALTER SESSION 修改。
例 3:修改缓存参数:
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
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 a20
SQL> select name, value from v$result_cache_statistics;
NAME VALUE
---------------------------- ----------
Block Size (Bytes) 1024
Block Count Maximum 3136
Block Count Current 32
Result Size Maximum (Blocks) 156
Create Count Success 2
Create Count Failure 0
Find Count 0
Invalidation Count 0
Delete Count Invalid 0
Delete Count Valid 0
例 2:查询缓存情况统计视图:
--查询 v$result_cache_statistics视图缓存信息
SQL> column name format a20
SQL> select name, value from v$result_cache_statistics;
NAME VALUE
---------------------------- ----------
Block Size (Bytes) 1024
Block Count Maximum 3136
Block Count Current 32
Result Size Maximum (Blocks) 156
Create Count Success 2
Create Count Failure 0
Find Count 0
Invalidation Count 0
Delete Count Invalid 0
Delete Count Valid 0
§1.4 小结
Oracle 系统提供的缓存可实现将查询结果缓存在内存里,但是,任何事情
都具有两面性,对于服务器缓存结果集来说,主要控制整个 Oracle 缓存数据的
量,即合理的将哪些使用重复频率高的数据是无可非议的。如果数据结构缓存功
能被过分使用,会导致整个数据库服务器的内存减少,最后可能走向反面。所以
建议 DBA 经常监控这样的功能的使用是否出现过度现象。