用outline修改固定執行計劃

wei-xh發表於2011-06-10

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章