1. 程式人生 > >Oracle 固定執行計劃--sqlprofile

Oracle 固定執行計劃--sqlprofile

步驟一-------------------------建立測試表,根據DBA_OBJECTS建立,OBJECT_ID上有索引 Create table test as select * from dba_objects; create index t_1 on test(test_id);   步驟二-------------------------檢視SQL預設執行計劃,走了索引 explain plan for select * from test where object_id= 172; select * from table(dbms_xplan.display(null,null,'outline')); ----通過指定outline可以獲取到系統為我們生成的hint ----------------------------------------------- | Id  | Operation                   | Name    | ----------------------------------------------- |   0 | SELECT STATEMENT            |         | |   1 |  TABLE ACCESS BY INDEX ROWID| TEST | |*  2 |   INDEX RANGE SCAN          | T_1     | ----------------------------------------------- Outline Data -------------     /*+       BEGIN_OUTLINE_DATA       INDEX_RS_ASC(@"SEL$1" "TEST"@"SEL$1

" ("TEST"."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(test) */* from test where object_id= 172;-----------增加HINT select * from table(dbms_xplan.display(null,null,'outline'));------可以看到全表掃描的hint已經為我們生成了,我們選取必要的hint就OK了,其他的可以不要 ------------------------------------- | Id  | Operation         | Name    | ------------------------------------- |   0 | SELECT STATEMENT  |         | |*  1 |  TABLE ACCESS FULL| TEST | ------------------------------------- Outline Data -------------     /*+       BEGIN_OUTLINE_DATA      FULL(@"SEL$1" "TEST"@"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" "TEST"@"SEL$1")'
); ----------從上面Outline Data部分獲取到的HINT   dbms_sqltune.import_sql_profile('select * from test where object_id= 172', ----------SQL語句部分                                   v_hints,                                   'TEST', --------------------------------PROFILE 的名字                                   force_match => true); end; /   步驟五-------------------------檢視是否生效,已經生效了 explain plan for select * from test where object_id= 172; select * from table(dbms_xplan.display(null,null,'outline')); -------------------------------------- | Id  | Operation         | Name    | -------------------------------------- |   0 | SELECT STATEMENT  |         | |*  1 |  TABLE ACCESS FULL| WXH_TBD | -------------------------------------- Note -----    - SQL profile "TEST" used for this statement

步驟六-------------------------刪除sql_profile,執行計劃用的是未改變slqprofile 之前的執行計劃

SQL> BEGIN   DBMS_SQLTUNE.DROP_SQL_PROFILE(name => 'TEST'); END;