本教程将介绍 Oracle 数据库 11g 中的结果缓存如何加快查询执行时间并改善应用程序的性能。
大约 40 分钟
本教程包括下列主题:
| 概述 | |
| 前提条件 | |
| 实施 SQL 查询结果缓存 | |
| 使用 PL/SQL 函数结果缓存 | |
| 总结 |
将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。
(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)
注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。
什么是结果缓存?
结果缓存可以缓存 SQL 查询和 PL/SQL 函数结果,将其存储到内存中。同一查询或函数的后续执行可以直接从缓存进行,从而加快了响应时间。该方法对频繁执行的 SQL 查询和 PL/SQL 函数尤为有效。
默认情况下,服务器端结果缓存配置为使用很小一部分的共享池。您可以使用 RESULT_CACHE_MAX_SIZE 初始化参数手动设置结果缓存内存的大小。将 RESULT_CACHE_MAX_SIZE 设置为 0 将禁用服务器端结果缓存。
开始本教程之前,您应该:
| 1. | 安装 Oracle 数据库 11g |
|
| 2. | 将 res_cache.zip 文件下载并解压缩到您的工作目录(即 wkdir),然后导航到您的工作目录。 |
|
新的 SQL 查询结果缓存在共享池的名为结果缓存内存的区域中实现查询和查询片断的显式缓存。执行查询时,将构建结果缓存并返回结果。然后,数据库可以使用缓存的结果执行后续查询,从而加快响应时间。查询访问的数据库对象(一个或多个)中的数据被修改后,缓存的查询结果变为无效数据。
您可以使用数据库初始化参数文件中的 RESULT_CACHE_MODE 初始化参数,在数据库级别启用查询结果缓存。使用 ALTER SESSION 命令还可以在会话级别使用该参数。RESULT_CACHE_MODE 可以设置为:
AUTO — 优化器将根据大量因素决定是否缓存结果。决定因素包括查询执行的频率、生成结果的成本以及针对底层数据库对象更改的频率。
MANUAL —(默认设置)您需要将 RESULT_CACHE 提示添加到查询中,以便缓存结果或从缓存中提取结果。还可以将 RESULT_CACHE 提示添加到子查询和内联视图中。
FORCE — 如果可能,始终将结果存储在结果缓存内存中。
SQL 查询结果缓存的使用在查询执行计划中引入了 ResultCache 操作符。
执行以下步骤,了解查询结果缓存的使用
| 1. |
打开一个终端窗口,然后登录到 SQL*Plus。以 SYS 身份连接到数据库。(在该 OBE 中,口令设置为 oracle)。 $ sqlplus sys /oracle as sysdba
|
|
| 2. |
运行 flush.sql 脚本,清理共享池和结果缓存。 SQL>@flush
|
|
| 3. |
运行 baseline.sql 脚本,检查内存缓存。缓存内存为 0 字节,因为尚未缓存任何内容。 SQL>@baseline.sql
|
|
| 4. |
运行 plan_query1.sql 脚本,检查执行计划。查询使用 RESULT_CACHE 优化器提示。 SQL>@plan_query1
| |
| 5. |
运行 plan_query2.sql 脚本,检查执行计划。该查询也使用 RESULT_CACHE 优化器提示。 SQL>@plan_query2
|
|
| 6. | 现在,运行 query3.sql 脚本,执行这两个查询。 SQL>@query3
|
|
| 7. | 查询 V$RESULT_CACHE_STATISTICS 来查看内存分配和使用统计信息。运行 v_stat.sql 脚本。注意,CREATE COUNT SUCCESS 列的值为 2。这是成功创建的缓存结果的数量(每个查询语句一个)。 SQL>@v_stat.sql
|
|
| 8. | 现在,再次运行 query3.sql 脚本,重新执行它包含的两个查询。 SQL>@query3
|
|
| 9. | 再次查询 V$RESULT_CACHE_STATISTICS 来查看内存分配和使用统计信息。运行 v_stat.sql 脚本。注意,FIND COUNT 列的值现在为 2。这是成功发现的缓存结果的数量(每个查询语句一个)。 SQL>@v_stat.sql
|
|
Oracle 数据库 11g 提供了标记 PL/SQL 函数以指明应该缓存其结果的能力。这样,下次使用同一参数值调用函数时就可以进行查找而不必重新计算了。缓存是系统级的,这样调用该函数的所有会话都会因缓存的返回值而收益。
您可以使用函数声明中的 RESULT_CACHE 选项激活 PL/SQL 函数缓存。此外,您也可以使用 RELIES_ON 子句指明您希望在相关的表遇到 DML 操作时清除缓存。
执行以下步骤来了解 PL/SQL 函数缓存的使用。
| 1. |
运行 flush.sql脚本,清理共享池和结果缓存。 SQL>@flush
|
| 2. |
运行 cre_func.sql 脚本,创建 PL/SQL 函数。该函数使用 RESULT_CACHE 子句,指明其结果应该缓存。它还使用 RELIES_ON 子句,指定函数结果依赖的表或视图。 SQL>@cre_func
|
| 3. |
运行 call_func.sql 脚本,在查询内部调用 PL/SQL 函数。 SQL>@call_func
|
| 4. |
运行 baseline.sql 脚本,验证内存分配。注意,已为 PL/SQL 块构建了结果缓存。 SQL>@baseline
|
| 5. |
查询 V$RESULT_CACHE_STATISTICS 来查看内存分配和使用统计信息。运行 v_stat.sql 脚本。注意,CREATE COUNT SUCCESS 列的值为 1。这是成功创建的缓存结果的数量。 SQL>@v_stat
|
| 6. |
运行 call_func.sql 脚本,再次调用 PL/SQL 函数。 SQL>@call_func
|
| 7. |
查询 V$RESULT_CACHE_STATISTICS 来查看内存分配和使用统计信息。运行 v_stat.sql 脚本。注意,FIND COUNT SUCCESS 列的值为 1。这是成功发现的缓存结果的数量。 SQL>@v_stat
|
| 8. |
查询 V$RESULT_CACHE_OBJECTS 来查看内存分配和使用统计信息。运行 v_obj.sql 脚本。注意,SCAN_COUNT 列的值为 1,意味着缓存的结果已被使用。 SQL>@v_obj
|
在本教程中,您学习了如何:
| 使用 SQL 查询结果缓存 | ||
| 使用 PL/SQL 函数结果缓存 | ||