Oracle的sql語句自動調優

1、創建測試表
SQL> create table t1 (
  2  n number);


2、生成測試數據
SQL> declare
  2  begin
  3  for i in 1 .. 10000
  4  loop
  5  insert into t1 values(i);
  6  commit;
  7  end loop;
  8  end;
  9  /
PL/SQL 過程已成功完成。


SQL> select count(*) from t1;
  COUNT(*)
----------
     10000


3、收集統計信息
   SQL>exec dbms_stats.gather_table_stats(ownname=>'TEST',tabname=>'T1',method_opt=>'for all columns size 1',CASCADE=>true);


4、創建索引 
SQL> create index idx_t1 on t1(n);

索引已創建。

5  、查詢語句,使用no_index 使語句不走索引
SQL> select /*+ no_index(t1 idx_t1)*/ * from t1 where n=1;

         N
----------
         1


6、查看執行計劃
SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  au4x8czp461nu, child number 0
-------------------------------------
select /*+ no_index(t1 idx_t1)*/ * from t1 where n=1


Plan hash value: 3617692013


--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     7 (100)|          |
|*  1 |  TABLE ACCESS FULL| T1   |     1 |     4 |     7   (0)| 00:00:01 |


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------


Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------


   1 - SEL$1 / T1@SEL$1

Outline Data
-------------

  /*+


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
      DB_VERSION('11.2.0.4')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      FULL(@"SEL$1" "T1"@"SEL$1")
      END_OUTLINE_DATA
  */


Predicate Information (identified by operation id):


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------

   1 - filter("N"=1)

Column Projection Information (identified by operation id):
-----------------------------------------------------------


   1 - "N"[NUMBER,22]




已選擇42行。


6、創建自動調整任務

SQL>declare
  my_task_name varchar2(30);
  my_sqltext clob;
  begin
    my_sqltext:='select /*+ no_index(t1 idx_t1)*/ * from t1 where n=1';
    my_task_name:=dbms_sqltune.create_tuning_task(
                        sql_text  => my_sqltext,
                        user_name => 'TEST',
                        scope     =>'COMPREHENSIVE',
                        time_limit=>60,
                        task_name =>'my_sql_tuning_task_2',
                        description=>'Task to tune a query on table t1');
  end;
  /
 
 7、執行自動調整任務 
 SQL>BEGIN
dbms_sqltune.execute_tuning_task(task_name=>'my_sql_tuning_task_2');
end;
/
8、查看自動調整任務的結果

SQL>SET LONG 9000
SQL>SET LONGCHUNKSIZE 1000
SQL>SET LINESIZE 200
SQL> select dbms_sqltune.report_tuning_task('my_sql_tuning_task_2') from dual;
DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : my_sql_tuning_task_2
Tuning Task Owner  : TEST
Workload Type      : Single SQL Statement
Scope              : COMPREHENSIVE
Time Limit(seconds): 60
Completion Status  : COMPLETED
Started at         : 09/03/2016 01:24:36
Completed at       : 09/03/2016 01:24:38




DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Schema Name: TEST
SQL ID     : 21qpu3xh964v1
SQL Text   : select /*+ no_index(t1 idx_t1)*/ * from t1 where n=1


-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------


1- SQL Profile Finding (see explain plans section below)
--------------------------------------------------------


DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  爲此語句找到了性能更好的執行計劃。


  Recommendation (estimated benefit: 90.9%)
  -----------------------------------------
  - 考慮接受推薦的 SQL 概要文件。
    execute dbms_sqltune.accept_sql_profile(task_name =>
            'my_sql_tuning_task_2', task_owner => 'TEST', replace => TRUE);


  Validation results
  ------------------
  已對 SQL profile 進行測試, 方法爲執行其計劃和原始計劃並測量與計劃相對應的執行統計信息。如果其中一個計劃運行在很短的時 間內就完成,


DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  則另一計劃可能只執行了一部分。


                           Original Plan  With SQL Profile  % Improved
                           -------------  ----------------  ----------
  Completion Status:            COMPLETE          COMPLETE
  Elapsed Time (s):             .000138           .000016       88.4 %
  CPU Time (s):                       0                 0
  User I/O Time (s):                  0                 0
  Buffer Gets:                       22                 2       90.9 %
  Physical Read Requests:             0                 0
  Physical Write Requests:            0                 0


DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  Physical Read Bytes:                0                 0
  Physical Write Bytes:               0                 0
  Rows Processed:                     1                 1
  Fetches:                            1                 1
  Executions:                         1                 1


  Notes
  -----
  1. the original plan 的統計信息是 10 執行的平均值。
  2. the SQL profile plan 的統計信息是 10 執行的平均值。




DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------


1- Original With Adjusted Cost
------------------------------
Plan hash value: 3617692013


--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------


DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     4 |     7   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |     1 |     4 |     7   (0)| 00:00:01 |
--------------------------------------------------------------------------


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


   1 - filter("N"=1)


2- Using SQL Profile
--------------------


DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1369807930


---------------------------------------------------------------------------
| Id  | Operation        | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT |        |     1 |     4 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| IDX_T1 |     1 |     4 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------


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


DBMS_SQLTUNE.REPORT_TUNING_TASK('MY_SQL_TUNING_TASK_2')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


   1 - access("N"=1)


-------------------------------------------------------------------------------






9、接受更好的執行計劃建議


SQL> execute dbms_sqltune.accept_sql_profile(task_name=>'my_sql_tuning_task_2',task_owner=>'TEST',replace=>TRUE);


PL/SQL 過程已成功完成。


10、再次執行sql語句,驗證結果
SQL> select /*+ no_index(t1 idx_t1)*/ * from t1 where n=1;


         N
----------
         1


11、查看執行計劃
SQL>  select * from table(dbms_xplan.display_cursor(null,null,'advanced'));


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  au4x8czp461nu, child number 0
-------------------------------------
select /*+ no_index(t1 idx_t1)*/ * from t1 where n=1


Plan hash value: 1369807930


---------------------------------------------------------------------------
| Id  | Operation        | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT |        |       |       |     1 (100)|          |
|*  1 |  INDEX RANGE SCAN| IDX_T1 |     1 |     4 |     1   (0)| 00:00:01 |


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------


Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------


   1 - SEL$1 / T1@SEL$1


Outline Data
-------------


  /*+


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
      DB_VERSION('11.2.0.4')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX(@"SEL$1" "T1"@"SEL$1" ("T1"."N"))
      END_OUTLINE_DATA
  */


Predicate Information (identified by operation id):


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------


   1 - access("N"=1)


Column Projection Information (identified by operation id):
-----------------------------------------------------------


   1 - "N"[NUMBER,22]


Note
-----


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   - SQL profile SYS_SQLPROF_0156ebfbb3b00000 used for this statement




已選擇46行。






12、穩定的執行計劃是不能有變動的,如果變動將不再生效,如當條件中n=2時,還是繼續走全表掃描。
SQL> select /*+ no_index(t1 idx_t1)*/ * from t1 where n=2;


         N
----------
         2


SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  1hnvc732gf7qu, child number 0
-------------------------------------
select /*+ no_index(t1 idx_t1)*/ * from t1 where n=2


Plan hash value: 3617692013


--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     7 (100)|          |
|*  1 |  TABLE ACCESS FULL| T1   |     1 |     4 |     7   (0)| 00:00:01 |


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------


Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------


   1 - SEL$1 / T1@SEL$1


Outline Data
-------------


  /*+


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
      DB_VERSION('11.2.0.4')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      FULL(@"SEL$1" "T1"@"SEL$1")
      END_OUTLINE_DATA
  */


Predicate Information (identified by operation id):


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------


   1 - filter("N"=2)


Column Projection Information (identified by operation id):
-----------------------------------------------------------


   1 - "N"[NUMBER,22]


已選擇42行。



13、通過調用dbms_sqltuen.drop_tuning_task可以刪除已經存在的優化任務

SQL>exec dbms_sqltune.drop_tuning_task('my_sql_tuning_task_2');









































































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章