用sql profile來固定執行計劃

wei-xh發表於2011-06-03
今天一個SQL用BASELINE沒搞定,BASELINE沒起作用,原因還在找。
忽然想起了SQL PROFILE,就試了一下,嘿嘿,果然還不錯,起作用了。
以下是個用法示例:
根據DBA_OBJECTS建立個表,OBJECT_ID列上建立索引。
按照OBJECT_ID去查詢,預設的走了索引,我們看看如何讓他透過SQL PROFILE去走全表掃描。

declare
     v_hints sys.sqlprof_attr;
   begin
     v_hints := sys.sqlprof_attr('full(wxh_tbd@sel$1)');----------HINT部分
     dbms_sqltune.import_sql_profile('select count(*) from wxh_tbd where object_id=:a',----------SQL語句部分
                                     v_hints,
                                     'SQLPROFILE_NAME3',--------------------------------PROFILE 的名字
                                     force_match => true);
   end;
   /
   
select count(*) from wxh_tbd where object_id=:a;

Execution Plan
----------------------------------------------------------
Plan hash value: 853361775

------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         |     1 |    13 |   144   (3)| 00:00:01 |
|   1 |  SORT AGGREGATE    |         |     1 |    13 |            |          |
|*  2 |   TABLE ACCESS FULL| WXH_TBD |   198 |  2574 |   144   (3)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("OBJECT_ID"=TO_NUMBER(:A))

Note
-----
   - SQL profile "SQLPROFILE_NAME3" used for this statement-----------------------我們看到SQL PROFILE 起作用了



SQL PROFILE的好處是,你的SQL語句不區分大小寫,回車之類的,只要文字一樣就OK,這個有點比較贊。
刪除SQL PROFILE
透過select * from dba_sql_profiles a;查詢出PROFILE 的NAME,
然後
exec dbms_sqltune.drop_sql_profile('SYS_SQLPROF_012ed61fe9bd0000');  來刪除

不過用SQL PROFILE,寫HINT的時候,我測試的情況是,必須寫上查詢塊的名稱,這在一定程度上,要求對查詢塊比較熟悉。   

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

相關文章