Oracle:Tuning the Result Cache

一、12c:官档

  • Books → Performance Tuning Guide → Part III Tuning Database Memory → 15 Tuning the Result Cache

二、关于 Result Cache

Result Cache 是内存区域,在共享全局区域(SGA)或客户机应用程序内存中,存储数据库查询或查询块的结果以便重用。缓存的行在SQL语句和会话之间共享,除非它们变得陈旧。

1 服务器 Result Cache 的概念

服务器 Result Cache 是 Shared Pool 中的内存池。这个内存池由SQL查询结果缓存组成,它存储SQL查询的结果,以及PL/SQL函数结果缓存,它存储由PL/SQL函数返回的值。
See Also:

  • 《Oracle Database Concepts》有关服务器结果缓存的信息。
  • 《Oracle Database PL/SQL Language Reference》有关PL/SQL函数结果缓存的信息。

1.1 使用服务器 Result Cache 的好处

使用服务器 Result Cache 的好处取决于应用程序。OLAP应用程序可以大大受益于它的使用。缓存的好候选者是访问大量行的查询,但返回的是一个小数目,比如数据仓库中的数据。例如,您可以使用高级查询重写,从而创建物化视图,在 Result Cache 中实现查询,而不是使用表。
See Also:

  • 《Oracle Database Data Warehousing Guide》有关使用 Result Cache 的信息,以及用相等的方法重写查询。

1.2 了解服务器 Result Cache 的工作方式

当执行查询时,数据库会搜索缓存内存,以确定 Result Cache 中是否存在结果。如果结果存在,那么数据库将从内存中检索结果,而不是执行查询。如果没有缓存结果,则数据库执行查询,将结果返回为输出,并将结果存储在 Result Cache 中。
当用户重复执行查询和函数时,数据库从缓存中检索行,减少响应时间。当依赖数据库对象的数据被修改时,缓存的结果将变得无效。

1.2.1 如何在查询中检索结果

下面的示例显示了hr的查询。使用RESULT_CACHE提示来从服务器 Result Cache 中检索行的员工。

SELECT /*+ RESULT_CACHE */ department_id, AVG(salary)
  FROM hr.employees
 GROUP BY department_id;

该查询的执行计划的一部分可能如下所示:

--------------------------------------------------------------
| Id | Operation          | Name                       |Rows
--------------------------------------------------------------
| 0 | SELECT STATEMENT    |                            | 11
| 1 |  RESULT CACHE       | 8fpza04gtwsfr6n595au15yj4y |
| 2 |   HASH GROUP BY     |                            | 11
| 3 |    TABLE ACCESS FULL| EMPLOYEES                  | 107
--------------------------------------------------------------

在本例中,结果直接从缓存中检索,如执行计划的第1步所示。Name列中的值是结果的缓存ID。
下面的示例显示了一个关于V$RESULT_CACHE_OBJECTS视图的查询,以检索关于 Result Cache 的详细统计信息。

SELECT id, type, creation_timestamp, block_count,
       column_count, pin_count, row_count
  FROM V$RESULT_CACHE_OBJECTS
 WHERE cache_id = '8fpza04gtwsfr6n595au15yj4y';

在本例中,CACHE_ID的值是在前面的示例中从执行计划中获得的缓存ID。该查询的输出可能如下所示:

        ID TYPE       CREATION_ BLOCK_COUNT COLUMN_COUNT  PIN_COUNT  ROW_COUNT
---------- ---------- --------- ----------- ------------ ---------- ----------
         2 Result     06-NOV-11           1            2          0         12

1.2.2 如何在视图中检索结果

示例 1 显示了在WITH子句视图中使用RESULT_CACHE提示的查询。
示例 1:RESULT_CACHE提示在WITH视图中指定。

WITH summary AS
( SELECT /*+ RESULT_CACHE */ department_id, avg(salary) avg_sal
    FROM hr.employees
   GROUP BY department_id )
SELECT d.*, avg_sal
  FROM hr.departments d, summary s
 WHERE d.department_id = s.department_id;

该查询的执行计划的一部分可能如下所示:

------------------------------------------------------------------------------------------------
| Id| Operation             | Name                      | Rows | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|  0| SELECT STATEMENT      |                           |   11 |   517 |     7  (29)| 00:00:01 |
|* 1|  HASH JOIN            |                           |   11 |   517 |     7  (29)| 00:00:01 |
|  2|   VIEW                |                           |   11 |   286 |     4  (25)| 00:00:01 |
|  3|    RESULT CACHE       | 8nknkh64ctmz94a5muf2tyb8r |      |       |            |          |
|  4|     HASH GROUP BY     |                           |   11 |    77 |     4  (25)| 00:00:01 |
|  5|      TABLE ACCESS FULL| EMPLOYEES                 |  107 |   749 |     3   (0)| 00:00:01 |
|  6|   TABLE ACCESS FULL   | DEPARTMENTS               |   27 |   567 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

在本例中,总结视图的结果是直接从缓存中检索的,如执行计划的第3步所示。Name列中的值是结果的缓存ID。

2 客户端 Result Cache 概念

Oracle调用接口(OCI)客户端 Result Cache 是客户端进程中的一个内存区域,它为OCI应用程序缓存SQL查询结果集。此客户端缓存存在于每个客户端进程中,并由流程中的所有会话共享。Oracle建议客户端 Result Cache 用于只读或只读的表的查询。
Note:
客户端 Result Cache 与驻留在SGA中的服务器 Result Cache 不同。当启用客户端 Result Cache 时,查询结果集可以缓存在客户端、服务器或两者中。即使服务器 Result Cache 被禁用,也可以启用客户机缓存。

2.1 使用客户端 Result Cache 的好处

OCI驱动程序,例如OCCI、JDBC OCI驱动程序和ODP.NET,支持客户端 Result Cache 。使用客户端结果缓存的性能好处包括:

  • 减少查询响应时间
    当多次执行查询时,应用程序将直接从客户端缓存内存中检索结果,从而产生更快的查询响应时间。
  • 更有效地使用数据库资源。
    服务器往返行程的减少可能导致服务器资源的大量性能节省,例如服务器CPU和I/O。这些资源可以用于其他任务,从而使服务器更具可伸缩性。
  • 减少内存成本
    Result Cache 使用客户端内存,这可能比服务器内存便宜。

2.2 了解客户端 Result Cache 的工作方式

客户端 Result Cache 存储最外层查询的结果,这是OCI应用程序定义的列。不缓存子查询和查询块。
下图演示了使用数据库登录会话的客户端流程。这个客户端进程在客户端进程中运行的多个应用程序会话之间共享一个客户端 Result Cache。如果第一个应用程序会话运行一个查询,那么它将从数据库检索行并在客户端 Result Cache 中缓存它们。如果其他应用程序会话运行相同的查询,那么它们也会从客户机结果缓存中检索行。

图 1:客户端 Result Cache

客户端 Result Cache 透明地保持结果集与影响它的会话状态或数据库更改一致。当事务更改用于构建缓存结果的数据库对象的数据或元数据时,数据库将在其下一次往返服务器的过程中向OCI客户端发送无效宣告。
See Also:

  • 《Oracle Call Interface Programmer's Guide》有关客户端 Result Cache 的详细信息。

三、配置 Result Cache

1 配置服务端 Result Cache

默认情况下,在数据库启动时,Oracle数据库将内存分配给 Shared Pool 中的服务器 Result Cache。分配的内存大小取决于 Shared Pool 的内存大小和所选的内存管理系统:

  • ASMM
    如果使用 SGA_TARGET 初始化参数管理 Shared Pool 的大小,Oracle数据库会将 SGA_TARGET 参数值的0.50%分配给结果缓存。
  • 手动共享内存管理
    如果使用 SHARED_POOL_SIZE 初始化参数管理 Shared Pool 的大小,则Oracle数据库将共享池大小的1%分配给结果缓存。

Note:
Oracle数据库不会将超过75%的共享池分配给服务器Result Cache。
服务器 Result Cache 的大小会增长直到达到最大大小。查询结果如果大于缓存中可用空间,则不会缓存。数据库使用了最近最少使用的(LRU)算法来计算缓存的结果,但不会自动从服务器 Result Cache 中释放内存。

 

1.1 使用初始化参数调整服务器 Result Cache

表 1 列出了控制服务器 Result Cache 的数据库初始化参数。

 

 

表 1:服务器 Result Cache 的数据库初始化参数

 

 

参数描述
RESULT_CACHE_MAX_SIZE指定分配给服务器结果缓存的内存。要禁用服务器Result Cache,将该参数设置为0。
RESULT_CACHE_MAX_RESULT指定可用于单个结果的服务器 Result Cache 内存的最大数量(百分比)。有效值在1到100之间。默认值为5%。您可以在系统或会话级别设置此参数。
RESULT_CACHE_REMOTE_EXPIRATION指定依赖于远程数据库对象的服务器 Result Cache 的过期时间(以分钟为单位)。默认值为0,该值指定使用远程对象的结果不会被缓存。如果为该参数设置了非零值,那么远程数据库上的DML不会使服务器 Result Cache 失效。

 

See Also:

 

  • 《Oracle Database Reference》有关这些初始化参数的更多信息。

要更改分配给服务器 Result Cache 的内存:

 

  • 将RESULT_CACHE_MAX_SIZE初始化参数的值设置为所需的大小。
    在Oracle实际应用程序集群(Oracle RAC)环境中,Result Cache 是特定于每个数据库实例的,并且在每个实例上都可以有不同的大小。然而,无效的工作跨越实例。要在集群中禁用服务器 Result Cache,必须显式地将此参数设置为每个实例启动时的0。

 

1.2 使用DBMS_RESULT_CACHE管理服务器 Result Cache

DBMS_RESULT_CACHE包提供了统计、信息和操作符,使您能够管理服务器 Result Cache 的内存分配。使用DBMS_RESULT_CACHE包执行操作,例如检索缓存内存使用的统计信息并刷新缓存。

1.2.1 查看服务器 Result Cache 的内存使用统计信息

本节描述如何使用DBMS_RESULT_CACHE包查看结果缓存的内存分配统计信息。
查看结果缓存的内存使用统计信息:

  • 执行DBMS_RESULT_CACHE.MEMORY_REPORT存储过程。
    示例 2 显示了这个过程的执行。

示例 2:使用 DBMS_RESULT_CACHE 包

SQL> SET SERVEROUTPUT ON
SQL> 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.2.2 刷新服务器 Result Cache

本节描述如何使用DBMS_RESULT_CACHE包删除所有已存在的结果并清除 Result Cache 内存。
要刷新服务器结果缓存:

  • 执行DBMS_RESULT_CACHE.FLUSH 存储过程。

 

See Also:

 

  • 《Oracle Database PL/SQL Packages and Types Reference》有关DBMS_RESULT_CACHE包的信息

2 配置客户端 Result Cache

表 2 列出了支持或影响客户端 Result Cache 行为的数据库初始化参数。

表 2:客户端 Result Cache 初始化参数

 

参数描述
CLIENT_RESULT_CACHE_SIZE指定每个客户机进程的客户机 Result Cache 的最大大小。要启用客户端 Result Cache,将大小设置为32768字节或更大。一个较小的值,包括默认的0,禁用了客户端 Result Cache。
注意: 如果CLIENT_RESULT_CACHE_SIZE设置禁用了客户端缓存,则客户机节点不能启用它。但是,如果CLIENT_RESULT_CACHE_SIZE设置启用了客户端缓存,则客户机节点可以覆盖该设置。例如,客户端节点可以禁用客户端 Result Cache 或增加其缓存的大小。
CLIENT_RESULT_CACHE_LAG指定客户端 Result Cache 的延迟时间(以毫秒为单位)。默认值是3000(3秒)。如果OCI应用程序在一段时间内不执行任何数据库调用,那么该设置将强制下一个语句执行调用来检查验证。
如果OCI应用程序不经常访问数据库,那么将该参数设置为低值,就会使OCI客户端对数据库进行更多的往返访问,从而使客户端 Result Cache 与数据库保持同步。
COMPATIBLE指定Oracle数据库必须保持兼容性的版本。对于启用的客户端 Result Cache,此参数必须设置为11.0.0.0或更高。对于视图中的客户端缓存,此参数必须设置为11.2.0.0.0或更高。

一个可选的客户端配置文件覆盖了服务器参数文件中设置的客户端 Result Cache 初始化参数。
Note:
客户端结果缓存延迟只能通过CLIENT_RESULT_CACHE_LAG初始化参数设置。
See Also:

  • 《Oracle Call Interface Programmer's Guide》有关可在客户端配置文件中设置的参数的信息。
  • 《Oracle Database Reference》有关这些客户端 Result Cache 初始化参数的更多信息。

3 设置 Result Cache 模式

Result Cache 模式是一个数据库设置,它决定哪些查询可以在服务器和客户端结 Result Cache 中存储结果集。如果查询有资格进行缓存,那么应用程序将检查 Result Cache,以确定在缓存中是否存在查询结果集。如果存在,则直接从 Result Cache 中检索结果。否则,数据库执行查询并将结果返回为输出,并将其存储在 Result Cache 中。Oracle建议对只读或只读数据库对象的查询进行结果缓存。
在启用 Result Cache 时,数据库还缓存调用非确定性PL/SQL函数的查询。当缓存SELECT语句调用这些函数时,Result Cache 将跟踪PL/SQL函数和数据库对象的数据依赖关系。但是,如果该函数使用未被跟踪的数据(如序列、SYSDATE、SYS_CONTEXT和包变量),则在调用该函数的查询中使用 Result Cache 会产生过时的结果。在这方面,Result Cache 的行为与缓存PL/SQL函数相同。因此,在选择启用 Result Cache 时,总是考虑数据的准确性,以及性能。
设置 Result Cache 模式:

  • 设置RESULT_CACHE_MODE初始化参数的值,以确定  Result Cache  的行为。
    您可以为实例(ALTER SYSTEM)、会话(ALTER session)或服务器参数文件设置此参数。
    表 3 描述了该参数的值。

表 3:RESULT_CACHE_MODE 参数的值

 

描述
MANUAL查询结果只能通过使用查询提示或表注释存储在 Result Cache 中。这是默认值和推荐值。
FORCE所有结果都存储在 Result Cache 中。如果查询结果不在缓存中,则数据库执行查询并将结果存储在缓存中。随后执行相同的SQL语句,包括Hint:Result Cache,从缓存中检索数据。如果可能,会话将使用这些结果。要排除来自缓存的查询结果,必须使用/*+ NO_RESULT_CACHE */查询提示。
注意:不推荐使用FORCE模式,因为数据库和客户端将尝试缓存所有查询,这可能会造成显著的性能和在开销上的延迟。此外,由于调用非确定性PL/SQL函数的查询也被缓存,因此以如此广泛的方式启用 Result Cache 可能会导致对结果的重大更改。

 

See Also:

 

  • 《Oracle Database Reference》有关RESULT_CACHE_MODE初始化参数的信息。

4 对 Result Cache 的需求

启用 Result Cache 并不能保证将特定的结果集包含在服务器或客户端结果缓存中。在缓存中,需要满足以下要求

4.1 读一致性要求

为了使快照可重用,它必须具有读一致性。对于有资格进行缓存的结果,至少有以下条件之一是正确的:

  • 用于构建结果的读取一致快照必须检索数据的当前提交状态。
  • 该查询使用flashback查询在时间上指向一个明确的点。

如果当前会话在查询中有一个引用对象的活动事务,那么这个查询的结果就没有资格进行缓存。

4.2 查询参数要求

如果查询是等价的,并且参数值是相同的,则缓存结果可以重用。不同的值或绑定变量名可能导致缓存丢失。如果查询中使用了以下构造,结果会被参数化:

  • 绑定变量
  • SQL函数DBTIMEZONE、SESSIONTIMEZONE、USERENV/SYS_CONTEXT(带有常量变量)、UID和用户。
  • NLS参数

4.3 对Result Cache的限制

当查询中有以下对象或函数时,无法缓存结果:

  • SYS 或 SYSTEM schema 中的临时表和表。
  • 序列中 CURRVAL 和 NEXTVAL 伪列。
  • SQL函数CURRENT_DATE、CURRENT_TIMESTAMP、LOCAL_TIMESTAMP、USERENV/SYS_CONTEXT(带有非常量变量)、SYS_GUID、SYSDATE和SYS_TIMESTAMP。

客户端 Result Cache 对结果缓存有额外的限制。
See Also:

  • 《Oracle Call Interface Programmer's Guide》有关客户端 Result Cache 的附加限制的信息。

四、指定用于 Result Cache 的查询

1 使用 SQL 的 Hint:Result Cache

在应用程序级别使用Hint:Result Cache 来控制缓存行为。SQL Result Cache Hint 优先于 Result Cache 模式和 Result Cache 表注释。
See Also:

  • 《Oracle Database SQL Language Reference》有关Hint:RESULT_CACHE 和 NO_RESULT_CACHE 的信息。

1.1 使用Hint:RESULT_CACHE

当 Result Cache 模式为手动时,Hint:/*+ RESULT_CACHE */将指示数据库缓存查询块的结果,并在将来执行时使用缓存的结果。
示例 3 显示了使用Hint:RESULT_CACHE的查询。
示例 3:使用Hint:RESULT_CACHE

SELECT /*+ RESULT_CACHE */ prod_id, SUM(amount_sold)
  FROM sales 
 GROUP BY prod_id
 ORDER BY prod_id;

在本例中,查询指示数据库为sales表的查询缓存行。

1.2 使用Hint:NO_RESULT_CACHE

Hint:/*+ NO_RESULT_CACHE */ 指示数据库不缓存服务器或客户端 Result Cache 中的结果。
示例 4 显示了使用Hint:NO_RESULT_CACHE 的查询。
示例 4:使用Hint:NO_RESULT_CACHE

SELECT /*+ NO_RESULT_CACHE */ prod_id, SUM(amount_sold) 
  FROM sales 
 GROUP BY prod_id
 ORDER BY prod_id;

在本例中,查询指示数据库不要为sales表的查询缓存行。

1.3 在视图里使用Hint:RESULT_CACHE

Hint:RESULT_CACHE 只适用于指定提示的查询块。如果提示仅在视图中指定,那么只缓存这些结果。视图缓存有以下特点:

  • 视图必须是以下类型之一:
    • 标准视图(用CREATE ... VIEW语句创建的视图)
    • 在SELECT语句的FROM子句中指定的内联视图。
    • 与with子句一起创建的内联视图。
  • 与相关列(对外部查询块的引用)的视图查询的结果不能被缓存。
  • 查询结果存储在服务器 Result Cache 中,而不是客户机 Result Cache。
  • 缓存视图并没有合并到它的外部(或引用)查询块中。
    将RESULT_CACHE提示添加到内联视图中,可以禁用外部查询和内联视图之间的优化,从而最大化缓存结果的可重用性。

下面的示例显示了内联视图视图1的查询。

SELECT *
  FROM ( SELECT /*+ RESULT_CACHE */ department_id, manager_id, count(*) count
           FROM hr.employees 
          GROUP BY department_id, manager_id ) view1
 WHERE department_id = 30;

在本例中,view1中的SELECT语句是外部块,而employee的SELECT语句是内部块。因为Hint:RESULT_CACHE只在内部块中指定,所以内部查询的结果存储在服务器Result Cache中,但是外部查询的结果没有被缓存。
假设相同的会话运行视图视图2的查询,如下面的示例所示。

WITH view2 AS
( SELECT /*+ RESULT_CACHE */ department_id, manager_id, count(*) count
    FROM hr.employees 
   GROUP BY department_id, manager_id ) 
SELECT *
  FROM view2 
 WHERE count BETWEEN 1 and 5;

在本例中,由于Hint:RESULT_CACHE 仅在WITH子句中的查询块中指定,因此雇员查询的结果可以被缓存。由于在第一个示例中缓存了这些结果,第二个示例中的WITH子句中的SELECT语句可以检索缓存的行。

2 使用 Result Cache 表注释

还可以使用表注释来控制结果缓存。表注释影响整个查询,而不是查询段。使用表注释的主要好处是避免了在应用程序级别添加Hint:RESULT_CACHE 到查询的必要性。由于表注释的优先级比SQL Hint:RESULT_CACHE 低,因此可以通过在查询级别使用Hint来覆盖表和会话设置。
表 4 描述了表注释:RESULT_CACHE的有效值。

表 4:表注释:RESULT_CACHE 的值。

 

描述
DEFAULT如果在查询中至少有一个表被设置为 DEFAULT,则该查询的表级别不会启用 Result Cache,除非将RESULT_CACHE_MODE初始化参数设置为 FORCE 或指定Hint:RESULT_CACHE。这是默认值。
FORCE如果查询的所有表都标记为 FORCE,那么将考虑查询结果以进行缓存。在会话级别上,表注释 FORCE 优先于设置 RESULT_CACHE_MODE参数值为 MANUAL 。

2.1 使用表注释:DEFAULT 

表注释:DEFAULT 防止数据库在表级缓存结果。
示例 5 展示了一个CREATE TABLE语句,它使用表注释:DEFAULT 来创建 sales 表和这个表的查询。
示例 5:使用表注释:DEFAULT

CREATE TABLE sales (...) RESULT_CACHE (MODE DEFAULT);

SELECT prod_id, SUM(amount_sold)
  FROM sales 
 GROUP BY prod_id 
 ORDER BY prod_id;

在本例中,sales表是用一个表注释创建的,该注释可禁用结果缓存。该示例还显示了sales表的查询,其结果由于表注释而不考虑缓存。
See Also:

  • 《Oracle Database SQL Language Reference》有关CREATE TABLE语句及其语法的信息。

2.2 使用表注释:FORCE 

表注释:FORCE 强制数据库在表级缓存结果。
使用示例 5 创建的sales表,假设您决定为该表强制执行结果缓存,您可以通过使用表注释:FORCE 来实现。
示例 6 展示了一个ALTER TABLE语句,它使用sales表上的表注释:FORCE 。
示例 6:使用表注释:FORCE 

ALTER TABLE sales RESULT_CACHE (MODE FORCE);

SELECT prod_id, SUM(amount_sold)
  FROM sales 
 GROUP BY prod_id 
HAVING prod_id=136;

SELECT /*+ NO_RESULT_CACHE */ * 
  FROM sales
 ORDER BY time_id DESC;

这个示例包含sales表的两个查询。第一个查询经常被使用并返回很少的行,因此有资格进行缓存,因为表注释。第二个查询是一个一次性查询,它返回许多行,使用 Hint 来防止结果缓存。

五、监控 Result Cache

要查看有关服务器和客户端 Result Cache 的信息,请查询相关的数据库视图和表。
表 5 描述了用于监视 Result Cache 的最有用的视图和表。

表 5:视图和表,包含有关 Result Cache 的信息。

 

视图/表描述
V$RESULT_CACHE_STATISTICS列出各种服务器 Result Cache 设置和内存使用统计信息。
V$RESULT_CACHE_MEMORY列出服务器 Result Cache 中的所有内存块及其对应的统计数据。
V$RESULT_CACHE_OBJECTS列出所有结果都在服务器 Result Cache 中的对象及其属性。
V$RESULT_CACHE_DEPENDENCY列出服务器 Result Cache 中结果与这些结果之间的依赖性之间的依赖关系细节。
CLIENT_RESULT_CACHE_STATS$存储从OCI客户端进程获得的客户端 Result Cache 的缓存设置和内存使用统计信息。这个统计表包含了使用 Result Cache 的每个客户机进程的条目。在客户端进程终止之后,数据库将从该表中删除它们的条目。客户端表包含与V$RESULT_CACHE_STATISTICS类似的信息。
DBA_TABLES, USER_TABLES, ALL_TABLES包含一个RESULT_CACHE列,它显示了表的结果 Result Cache 注释。如果表没有注释,则此列显示默认值。这个列适用于服务器和客户端 Result Cache 。

 

See Also:

 

  • 《Oracle Database Reference》有关这些视图和表的更多信息。

下面的示例显示了用于监视服务器 Result Cache 统计数据的V$RESULT_CACHE_STATISTICS视图的查询。

COLUMN name FORMAT a20
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

下面的示例显示了CLIENT_RESULT_CACHE_STATS$表的查询,用于监视客户端 Result Cache 统计数据。

SELECT stat_id, SUBSTR(name,1,20), value, cache_id
  FROM CLIENT_RESULT_CACHE_STATS$
 ORDER BY cache_id, stat_id;

该查询的输出可能如下所示:

STAT_ID    NAME OF STATISTICS      VALUE   CACHE_ID
=======    ==================      =====   ========
    1      Block Size               256         124
    2      Block Count Max          256         124
    3      Block Count Current      128         124
    4      Hash Bucket Count       1024         124
    5      Create Count Success      10         124
    6      Create Count Failure       0         124
    7      Find Count                12         124
    8      Invalidation Count         8         124
    9      Delete Count Invalid       0         124
   10      Delete Count Valid         0         124

CLIENT_RESULT_CACHE_STATS$表包含用于执行客户端 Result Cache 的每个活动客户端流程的统计条目。每个客户端进程都有一个惟一的缓存ID。
为执行客户端缓存的会话找到客户端连接信息:

  1. 在GV$SESSION_CONNECT_INFO视图中从CLIENT_REGID列获取会话id,该视图对应于CLIENT_RESULT_CACHE_STATS$表中的CACHE_ID列。
  2. 从GV$SESSION_CONNECT_INFO和GV$会话视图查询相关列。

对于服务器端和客户端 Result Cache 统计数据,为结果缓存优化的数据库应该为 Create Count Failure 和 Delete Count Valid 的统计数据显示相对较低的值,同时显示 Find Count 统计数据的相对较高的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值