方案一:
##################################################################################################################################################################
第一步:
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=>’WBB’,
scope=>’COMPREHENSIVE’,
time_limit=>60,
task_name=>’my_sql_tuning_task_2’,
description=>’Task to tune a query on table t1’);
end;
/
第二步:
SQL> select task_name,status,execution_start,execution_end from user_advisor_log;
TASK_NAME STATUS EXECUTION EXECUTION
SYS_AUTO_SPM_EVOLVE_TASK COMPLETED 09-JAN-20 09-JAN-20
SYS_AI_SPM_EVOLVE_TASK INITIAL
SYS_AI_VERIFY_TASK INITIAL
SYS_AUTO_INDEX_TASK INITIAL
AUTO_STATS_ADVISOR_TASK COMPLETED 09-JAN-20 09-JAN-20
INDIVIDUAL_STATS_ADVISOR_TASK INITIAL
my_sql_tuning_task_1 INITIAL
第三步:
SQL> begin
dbms_sqltune.execute_tuning_task(task_name=>’my_sql_tuning_task_2’);
end;
/
PL/SQL procedure successfully completed.
SQL> select task_name,status,execution_start,execution_end from user_advisor_log;
TASK_NAME STATUS EXECUTION EXECUTION
SYS_AUTO_SPM_EVOLVE_TASK COMPLETED 09-JAN-20 09-JAN-20
SYS_AI_SPM_EVOLVE_TASK INITIAL
SYS_AI_VERIFY_TASK INITIAL
SYS_AUTO_INDEX_TASK INITIAL
AUTO_STATS_ADVISOR_TASK COMPLETED 09-JAN-20 09-JAN-20
INDIVIDUAL_STATS_ADVISOR_TASK INITIAL
my_sql_tuning_task_1 COMPLETED 09-JAN-20 09-JAN-20
7 rows selected.
第四步:
set long 9000
set longchunksize 1000
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 : SYS
Workload Type : Single SQL Statement
Scope : COMPREHENSIVE
Time Limit(seconds): 60
Completion Status : COMPLETED
Started at : 01/10/2020 08:23:09
Completed at : 01/10/2020 08:23:12
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
Schema Name : WBB
Container Name: WBB
SQL ID : 1kg76709mx29d
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’)
A potentially better execution plan was found for this statement.
Recommendation (estimated benefit: 90.9%)
- Consider accepting the recommended SQL profile.
execute dbms_sqltune.accept_sql_profile(task_name =>'my_sql_tuning_task_2', task_owner => 'SYS', replace => TRUE);
Validation results
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
The SQL profile was tested by executing both its plan and the original plan
and measuring their respective execution statistics. A plan may have been
only partially executed if the other could be run to completion in less time.
Original Plan With SQL Profile % Improved
------------- ---------------- ----------
Completion Status: COMPLETE COMPLETE
Elapsed Time (s): .001968 .000039 98.01 %
CPU Time (s): .000327 .000039 88.07 %
User I/O Time (s): 0 0
Buffer Gets: 22 2 90.9 %
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
Physical Read Requests: 0 0
Physical Write Requests: 0 0
Physical Read Bytes: 0 0
Physical Write Bytes: 0 0
Rows Processed: 1 1
Fetches: 1 1
Executions: 1 1
Notes
- Statistics for the original plan were averaged over 10 executions.
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
2. Statistics for the SQL profile plan were averaged over 10 executions.
EXPLAIN PLANS SECTION
1- Original With Adjusted Cost
Plan hash value: 3617692013
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 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)
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 3 (U - Unused (3))
0 - STATEMENT
U - IGNORE_OPTIM_EMBEDDED_HINTS / hint overridden by another in parent query block
U - OPTIMIZER_FEATURES_ENABLE(default) / hint overridden by another in parent query block
1 - SEL$1 / T1@SEL$1
U - no_index(t1 idx_t1) / rejected by IGNORE_OPTIM_EMBEDDED_HINTS
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
2- Using SQL Profile
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 |
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
Predicate Information (identified by operation id):
1 - access(“N”=1)
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (U - Unused (1))
1 - SEL$1 / T1@SEL$1
U - no_index(t1 idx_t1) / rejected by IGNORE_OPTIM_EMBEDDED_HINTS
DBMS_SQLTUNE.REPORT_TUNING_TASK(‘MY_SQL_TUNING_TASK_2’)
第五步:
execute dbms_sqltune.accept_sql_profile(task_name =>’my_sql_tuning_task_2’, task_owner => ‘SYS’, replace => TRUE);
验证即可:
普通用户执行
SQL> select /*+ no_index(t1 idx_t1) */ * from t1 where n=1;
N
1
Execution Plan
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):
1 - access(“N”=1)
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (U - Unused (1))
1 - SEL$1 / T1@SEL$1
U - no_index(t1 idx_t1) / rejected by IGNORE_OPTIM_EMBEDDED_HINTS
Note
- SQL profile “SYS_SQLPROF_016f8ce95f930000” used for this statement
Statistics
36 recursive calls
0 db block gets
11 consistent gets
1 physical reads
0 redo size
543 bytes sent via SQL*Net to client
415 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
############################################################
注:按照此情况固定了执行计划,但目标sql一旦发生一点儿变动原有的sql_profile将会失去作用。需要将force_match 设为true
第六步:
select /*+ no_index(t1 idx_t1) */ * from t1 where n=2;
N
2
Execution Plan
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):
1 - access(“N”=2)
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (U - Unused (1))
1 - SEL$1 / T1@SEL$1
U - no_index(t1 idx_t1) / rejected by IGNORE_OPTIM_EMBEDDED_HINTS
Note
- SQL profile “SYS_SQLPROF_016f8cf78bf80001” used for this statement
Statistics
7 recursive calls
0 db block gets
6 consistent gets
1 physical reads
0 redo size
543 bytes sent via SQL*Net to client
415 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
第七步:
execute dbms_sqltune.accept_sql_profile(task_name =>’my_sql_tuning_task_2’, task_owner => ‘SYS’, replace => TRUE,force_match=>true);
方案二:
#####################################################################################################################################################################
SQL> exec dbms_sqltune.drop_sql_profile(‘SYS_SQLPROF_016f8cf78bf80001’); SYS_SQLPROF_016f8cf78bf80001 可从执行计划中得知。
PL/SQL procedure successfully completed.
SQL> exec dbms_sqltune.drop_sql_profile(‘SYS_SQLPROF_016f8ce95f930000’);
PL/SQL procedure successfully completed.
select /*+ no_index(t1 idx_t1) */ * from t1 where n=1;查看执行计划已走全表
1.manual 类型的sql_profile本质上就是一堆hint的组合,这一堆hint的组合实际上来源于执行计划的outline data 部分的hint组合。