SQL PROFILE修改固定執行計劃

531968912發表於2016-05-18
發給團隊的,有需要的可以參照下。下面是原文,懶的編輯了

SQL PROFILE的用法示例,下週週會給應用DBA演示下。一般只需要步驟三、四就可以完成執行計劃的修改和固定,而outline和baseline則需要N多個步驟。
SQL PROFILE使用簡單,不區分大小寫,回車,空格,但是對DBA寫HINT的能力要求比較高,因為SQL PROFILE要求HINT必須寫明查詢塊名。
我的示例裡教了大家偷懶的做法,但是有時間我們還是最好認真把query block的東西學下。
SQL PROFILE還有其他一些牛逼的特性,具體其他細節,週會上再說。

步驟一-------------------------建立測試表,根據DBA_OBJECTS建立,OBJECT_ID上有索引
Create table wxh_tbd as select * from dba_objects;
create index t_3 on wxh_tbd(object_id);

步驟二-------------------------檢視SQL預設執行計劃,走了索引
explain plan for select * from wxh_tbd where object_id= :a;
select * from table(dbms_xplan.display(null,null,'outline'));-------------------透過指定outline可以獲取到系統為我們生成的hint
-----------------------------------------------
| Id  | Operation                   | Name    |
-----------------------------------------------
|   0 | SELECT STATEMENT            |         |
|   1 |  TABLE ACCESS BY INDEX ROWID| WXH_TBD |
|*  2 |   INDEX RANGE SCAN          | T_3     |
-----------------------------------------------
Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      INDEX_RS_ASC(@"SEL$1" "WXH_TBD"@"SEL$1" ("WXH_TBD"."OBJECT_ID"))
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      DB_VERSION('11.1.0.7')
      OPTIMIZER_FEATURES_ENABLE('11.1.0.7')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

步驟3-------------------------如果我們想讓它走全表掃描,獲取全表掃描HINT
explain plan for select /*+ full(wxh_tbd) */* from wxh_tbd where object_id= :a;-----------增加HINT
select * from table(dbms_xplan.display(null,null,'outline'));------------可以看到全表掃描的hint已經為我們生成了,我們選取必要的hint就OK了,其他的可以不要
-------------------------------------
| Id  | Operation         | Name    |
-------------------------------------
|   0 | SELECT STATEMENT  |         |
|*  1 |  TABLE ACCESS FULL| WXH_TBD |
-------------------------------------
Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
     FULL(@"SEL$1" "WXH_TBD"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      DB_VERSION('11.1.0.7')
      OPTIMIZER_FEATURES_ENABLE('11.1.0.7')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

步驟4--------------------------使用sql profile
declare
  v_hints sys.sqlprof_attr;
begin
  v_hints := sys.sqlprof_attr('FULL(@"SEL$1" "WXH_TBD"@"SEL$1")'); ----------從上面Outline Data部分獲取到的HINT
  dbms_sqltune.import_sql_profile('select * from wxh_tbd where object_id= :a', ----------SQL語句部分
                                  v_hints,
                                  'WXH_TBD', --------------------------------PROFILE 的名字
                                  force_match => true);
end;
/

步驟五-------------------------檢視是否生效,已經生效了
explain plan for select * from wxh_tbd where object_id= :a;
select * from table(dbms_xplan.display);
--------------------------------------
| Id  | Operation         | Name    |
--------------------------------------
|   0 | SELECT STATEMENT  |         |
|*  1 |  TABLE ACCESS FULL| WXH_TBD |
--------------------------------------
Note
-----
   - SQL profile "WXH_TBD" used for this statement


[ 本帖最後由 wei-xh 於 2011-6-9 16:48 編輯 ]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2102539/,如需轉載,請註明出處,否則將追究法律責任。

相關文章