6
§1 Oracle 查询数据缓存问题 关键字:OracleSQL 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 版本:

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

Embed Size (px)

DESCRIPTION

 

Citation preview

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

§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 版本:

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

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

下面例子列出目前内存中缓存的情况信息:

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

--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)

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

例 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:修改缓存参数:

连接到:

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

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:查询缓存情况统计视图:

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

--查询 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 经常监控这样的功能的使用是否出现过度现象。