已归录
测试环境:11.2.0.4.0
在实际项目中经常遇到的一个问题是,在开发环境下一些 SQL 执行没有任何问题,而到了生产环境或生产环境的数据量发生较大的变量时,其 SQL 的执行效率会异常的慢。此时如果更改 SQL ,则可能需要重新修改源程序以及重新编译程序。如果觉得修改源程序的成本比较大,则可以使用 OUTLINE 在不改变原应用程序的情况下更改特定 SQL 的执行计划。
Oracle Stored Outline,中文译为存储大纲(存储概要),是 9i 以及 9i 之前能唯一使用的稳定执行计划的工具。
从 10g 以后,Oracle 连续推出了 SQL Profile 与 SPM,官方已经申明 Outline 这个工具将被废弃并且不再维护。
Stored outlines will be desupported in a future release in favor of SQL plan management. In Oracle Database 11g stored outlines continue to function as in past releases. However, Oracle strongly recommends that you use SQL plan management for new applications. SQL plan management creates SQL plan baselines, which offer superior SQL performance and stability compared with stored outlines.
目前 Outline 已经非常少使用,鉴于此,我们只对 Outline 作一个简单的介绍。
Stored Outline 本质上是 hints 的集合,Stored Outline 将执行计划的 hints 集合保存起来。当 SQL 解析时,Oracle 会与 Stored outline 中的 SQL 比较(忽略空格和大小写),如有,则通过保存的 hint 集合生成指定运行计划。
可以通过 dba_outlines 视图来查看现有的 outlines,默认为空。
创建 outline 有三种方法:
1.给会话甚至整个系统运行的每一条 SQL 语句都创建 outline
2.给指定语句创建 outline
3.对共享池中已经存在的 SQL 语句创建 outline
下面对 outline 作一个简单的演示:
创建实验用的表与用户:
SQL> grant create any outline, alter any outline, drop any outline to cy identified by cy;
SQL> grant all on OL$HINTS to cy;
SQL> grant dba to cy;
SQL> create table cy.cyt as select * from dba_tables;
创建索引,执行两个查寻语句:
SQL> connect hr/hr
SQL> create index idx_cyt_table_name on cyt(table_name);
SQL> set autotrace on;
SQL> select owner from cyt where table_name='CYT'; 走的索引(A语句)
SQL> select /*+full(CYT)*/ owner from cyt where table_name='CYT'; 走的全表扫描(B语句)
SQL> set autotrace off;
为两个语句创建 outline:
SQL> create or replace outline CYOTL1 on select owner from cyt where table_name='CYT';
SQL> create or replace outline CYOTL2 on select /*+full(CYT)*/ owner from cyt where table_name='CYT';
交换两个 SQL 的 hints:
SQL> UPDATE OUTLN.OL$
SET OL_NAME=DECODE(OL_NAME,'CYOTL1','CYOTL2','CYOTL2','CYOTL1')
WHERE OL_NAME IN ('CYOTL1','CYOTL2');
SQL> commit;
使用 outline 后,执行计划将根据 outline 里面保存的 hints 集产生:
SQL> alter system set use_stored_outlines=true;
用上面的命令启用 outline 后,A 语句将走全表扫描,B 语句将走索引。
如果不使用上面的命令启用 outline,还是由 oracle 根据统计信息或者语句中的 hints 生成执行计划。