(2) 对于绑定变量,将使用变量值对高速缓存结果进行参数化。只能找到相同变量值的高速缓存结果。也就是说,不同的值或绑定变量名称将导致高速缓存未命中。
注意事项如下:
1.对包含以下内容的查询禁用结果高速缓存:
– 临时表或字典表
– 不确定的PL/SQL 函数
– CURRVAL 和NEXTVAL 序列
– current_date、sysdate 和sys_guid 等SQL 函数
2.远程数据库上的DML/DDL 不会使高速缓存结果过期。
3.可高速缓存闪回查询。
4.结果高速缓存不会自动释放内存。
– 它将不断增长,直到达到最大大小。
– DBMS_RESULT_CACHE.FLUSH 会清除内存。
5.绑定变量
– 将使用变量值对高速缓存结果进行参数化。
– 只能找到相同变量值的高速缓存结果。
6.对于以下情况,不会生成高速缓存结果:
– 查询是基于数据的非当前版本构建的(强制实施读取一致性)
– 当前会话在查询的表中存在未完成的事务处理
1.8 OCI 客户机查询高速缓存
在Oracle Database11g 中,可以使用Oracle 调用接口(OCI) 客户机查询高速缓存对客户机内存中的查询结果集启用高速缓存。
高速缓存结果集数据以透明方式与服务器端上的所有更改保持一致。由于高速缓存中保存有相应信息,因此利用此功能的应用程序会提高查询的性能。此外,使用高速缓存的查询可避免在发送查询和获取结果时在客户机和服务器之间进行往返。处理查询所用的服务器CPU 会减少,从而提高了服务器的可扩展性。
在使用客户端查询高速缓存之前,请确定应用程序是否会受益于此功能。当您的应用程序生成重复的结果集、小型结果集、静态结果集或频繁执行的查询时,客户端高速缓存非常有用。
客户机和服务器结果高速缓存是独立的,可独立启用或禁用它们。
注:可以使用client_result_cache_stats$视图或v$client_result_cache_stats 视图来监视客户机查询高速缓存。
使用客户端缓存优点如下:
(1) 将服务器端查询高速缓存扩展到客户端内存
(2) 通过消除客户机与服务器之间的往返可以提高性能
(3) 利用客户端内存
(4) 通过节省服务器CPU 资源提高服务器的可扩展性
(5) 服务器上的结果集发生更改时会自动刷新结果高速缓存
(6) 尤其适用于查找表
1.9 使用客户端查询高速缓存
可通过以下方式使用客户端查询高速缓存:
设置初始化参数
– CLIENT_RESULT_CACHE_SIZE
– CLIENT_RESULT_CACHE_LAG
使用客户机配置文件
– OCI_RESULT_CACHE_MAX_SIZE
– OCI_RESULT_CACHE_MAX_RSET_SIZE
– OCI_RESULT_CACHE_MAX_RSET_ROWS
根据以下项使用客户机结果高速缓存:
– 表结果高速缓存模式
– SQL 语句中的RESULTCACHE 提示
CLIENT_RESULT_CACHE_SIZE :非零值表示启用客户机结果高速缓存。这是客户机每个进程的结果集高速缓存的最大大小(以字节表示)。所有OCI 客户机进程都可达到此最大值,可以使用OCI_RESULT_CACHE_MAX_SIZE参数覆盖此值。
CLIENT_RESULT_CACHE_LAG :自客户机与服务器之间的最后一次往返后的最长时间(以毫秒为单位),在此之前OCI 客户机查询执行一次往返以获得与在客户机上高速缓存的查询相关的所有数据库更改。
客户机配置文件是可选的,并且可覆盖服务器初始化参数文件中的高速缓存参数集。参数值可以包含于sqlnet.ora 文件中。
OCI_RESULT_CACHE_MAX_RSET_SIZE/ROWS表示每个进程的查询高速缓存中所有结果集的最大大小(以字节/行表示)。OCI 应用程序可使用应用程序提示来强制执行结果高速缓存存储。这将覆盖ALTERTABLE/ALTER VIEW 的部署时间设置。
该应用程序提示可以是:
(1) SQL 提示/*+ result_cache */, and /*+no_result_cache */
(2) OCIStmtExecute() 模式。这些内容将覆盖SQL 提示。
注:要使用此功能,该应用程序必须与版本11.1 或更高版本的客户机库重新链接,并连接到版本11.1 或更高版本的服务器。
1.10 PL/SQL 函数高速缓存
从Oracle Database11g 开始,可以使用PL/SQL 跨段函数结果高速缓存机制。此高速缓存机制提供了一种语言受到支持且由系统管理的方法,可将PL/SQL 函数的结果存储在共享全局区域(SGA) 中,运行应用程序的每个会话均可使用这种方法。该高速缓存机制不仅高效而且易于使用,可以减轻设计和开发自己的高速缓存和高速缓存管理策略的工作。
Oracle Database11g可以标记PL/SQL 函数,指示应高速缓存其结果,这样在下一次访问调用相同参数值时,可以进行查找,而无需重新计算。此函数结果高速缓存可节省大量空间和时间。这是通过将输入参数用作查找关键字以透明方式完成的。高速缓存是针对整个实例的,因此所有调用该函数的不同会话都可从中受益。如果更改了给定参数集的结果,则可以通过构造使高速缓存条目失效,以便在下一次访问时正确地对其进行重新计算。如果函数返回的值是根据从方案级表中选择的数据计算出来的,则此功能尤其有用。
对于此类用法,失效构造十分简单,并且是声明性的。可在PL/SQL 函数的源文本中包括语法,以请求高速缓存函数结果并确保其正确性,并请求当表列表中出现相应DML 时清除此高速缓存。如果调用高速缓存结果的函数时发现高速缓存中包含结果值,则不执行函数主体,而是立即返回高速缓存的值。
1.11 使用PL/SQL函数高速缓存
PL/SQL 函数高速缓存使用:
(1) 在程序包的函数声明部分或函数定义中包括RESULT_CACHE选项。
(2) 可以选择包括RELIES_ON 子句,以指定函数结果依赖的任何表或视图。
如:
CREATE OR REPLACE FUNCTION productName
(prod_id NUMBER, lang_id VARCHAR2)
RETURN NVARCHAR2
RESULT_CACHE RELIES_ON (product_descriptions)
IS
result VARCHAR2(50);
BEGIN
SELECT translated_name INTO result
FROM product_descriptions
WHERE product_id = prod_id AND language_id= lang_id;
RETURN result;
END;
使用说明:
(1)如果函数的执行导致了未处理的异常错误,该异常结果不会存储在高速缓存中。
(2)在以下情况下执行高速缓存结果的函数主体:
- 此数据库实例上的会话第一次使用这些参数值调用该函数。这些参数值的高速缓存结果无效。
- 当在函数定义的RELIES_ON 子句中指定的任何数据库对象发生更改时,高速缓存的结果就会失效。
- 这些参数值的高速缓存结果已过时。如果系统需要更多内存,它可能会放弃最早的高速缓存值。
- 该函数绕过高速缓存。
(3)该函数不应有任何负作用。
(4)该函数不应依赖特定于会话的设置。
(5)该函数不应依赖特定于会话的应用程序上下文。
1.12 PL/SQL 函数高速缓存: