ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 用outline修改固定执行计划

用outline修改固定执行计划

原创 Linux操作系统 作者:wei-xh 时间:2011-06-10 12:16:58 0 删除 编辑

http://www.itpub.net/thread-1445125-1-1.html
打算把固定执行计划的方法做个整理和比较。上面的链接是SQL PROFILE的用法。这篇说下OUTLINE的用法。

目的:让执行计划走上全表扫描

步骤一-------------------------创建测试表,根据DBA_OBJECTS创建,OBJECT_ID上有索引
Create table wxh_tbd as select * from dba_objects;
create index t_3 on wxh_tbd(object_id);


步骤二--------------------------创建outline。由于默认的执行计划是索引的,因此后续我们需要修改这个OUTLINE。让它走全表
create or replace outline pub_out on select * from wxh_tbd where object_id=:1;


步骤三--------------------------创建两个私有OUTLINE,之所以创建两个,是为了让彼此的HINT做交换
create or replace private outline pri_out_1 on select * from wxh_tbd where object_id=:1;
create or replace private outline pri_out_2 on select /*+ full(wxh_tbd) */ * from wxh_tbd where object_id=:1;

步骤四-------------------------交换两个OUTLINE的HITN
update ol$hints set ol_name=decode(ol_name,'PRI_OUT_1','PRI_OUT_2','PRI_OUT_2','PRI_OUT_1') where ol_name in ('PRI_OUT_1','PRI_OUT_2');
commit;

步骤五------------------------测试结果。在当前SESSION生效,看到执行计划NOTE部分用到了OUTLINE
alter session set use_private_outlines=true;

execute dbms_outln_edit.refresh_private_outline('PRI_OUT_1');
execute dbms_outln_edit.refresh_private_outline('PRI_OUT_2');
explain plan for
select * from wxh_tbd where object_id=:1;
select * from table(dbms_xplan.display(null,null,'outline'));
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |   577 |    99K|   140   (2)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| WXH_TBD |   577 |    99K|   140   (2)| 00:00:02 |
-----------------------------------------------------------------------------
Note
-----
   - outline "PRI_OUT_1" used for this statement


步骤六--------------------------发布到公共OUTLINE
create or replace outline pub_out from private PRI_OUT_1;

步骤七--------------------------另开一个SESSION,确定已经用到了OUTLINE
SQL> explain plan for
  2   select * from wxh_tbd where object_id=:1;

已解释。
SQL> select * from table(dbms_xplan.display(null,null,'outline'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3295978849

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |   577 |    99K|   140   (2)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| WXH_TBD |   577 |    99K|   140   (2)| 00:00:02 |
-----------------------------------------------------------------------------

Note
-----
   - outline "PUB_OUT" used for this statement

NOTE:以上实验是在use_stored_outlines=true情况下运行的。如果这个参数没打开,那么你会发现最后一步,还是没使用上OUTLINE.
 
outline有一个缺陷,就是初始化参数use_stored_outlines不能够在pfile,spfile里指定,必须系统启动后指定。对于使用了outline的系统,可以使用触发器实现系统启动后这个参数的自动设置。
create or replace trigger enable_outlines_trig
after startup on database
begin
execute immediate('alter system set use_stored_outlines=true');
end;
/
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-697564/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE组成员,DBGeeK用户组发起人。曾在DTCC、ORACLE技术嘉年华、Gdevops等公开场合做过数据库技术专题分享,2017年应Oracle邀请在世界最大的数据库会议OOW上做技术分享。组织翻译了《拨云见日,解密Oracle ASM内核》一书。

注册时间:2009-07-04

  • 博文量
    422
  • 访问量
    2315006