SQL自动调优,是oracle 自带的调优工具,可以提出一些解决方案。
本次我主要介绍下面这些自动SQL调优工具:
- 自动SQL调优(automatic sql tuning)
- SQL调优工具集(SQL tuning sets,STS)
- SQL调优顾问(SQL Tuning Advisor)
- 自动数据库诊断监视器(addm)
显示SQL自动调优建议最快的方法:
SQL> select dbms_auto_sqltune.report_auto_tuning_task from dual;
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name : SYS_AUTO_SQL_TUNING_TASK
Tuning Task Owner : SYS
Workload Type : Automatic High-Load SQL Workload
Execution Count : 2
Current Execution : EXEC_41
Execution Type : TUNE SQL
Scope : COMPREHENSIVE
Global Time Limit(seconds) : 3600
Per-SQL Time Limit(seconds) : 1200
Completion Status : COMPLETED
Started at : 09/13/2015 23:19:10
Completed at : 09/13/2015 23:20:50
Number of Candidate SQLs : 2
Cumulative Elapsed Time of SQL (s) : 56
-------------------------------------------------------------------------------
SUMMARY SECTION
-------------------------------------------------------------------------------
Global SQL Tuning Result Statistics
-------------------------------------------------------------------------------
Number of SQLs Analyzed : 2
Number of SQLs in the Report : 2
Number of SQLs with Findings : 2
Number of SQLs with Statistic Findings : 2
Number of SQLs with Alternative Plan Findings: 1
Number of SQLs with SQL profiles recommended : 2
-------------------------------------------------------------------------------
SQLs with Findings Ordered by Maximum (Profile/Index) Benefit, Object ID
-------------------------------------------------------------------------------
object ID SQL ID statistics profile(benefit) index(benefit) restructure
---------- ------------- ---------- ---------------- -------------- -----------
3 5jvf84zg4c49n 2 94.73%
4 fa16465c7pqmd 1 93.52%
-------------------------------------------------------------------------------
Objects with Missing/Stale Statistics (ordered by schema, object, type)
-------------------------------------------------------------------------------
Schema Name Object Name Type State Cascade
---------------------------- ---------------------------- ----- ------- -------
SYS IND$ TABLE STALE NO
USER$ TABLE STALE NO
-------------------------------------------------------------------------------
DETAILS SECTION
-------------------------------------------------------------------------------
Statements with Results Ordered by Maximum (Profile/Index) Benefit, Object ID
-------------------------------------------------------------------------------
Object ID : 3
Schema Name: SYS
SQL ID : 5jvf84zg4c49n
SQL Text : select s.synonym_name as object_name, o.object_type
from sys.all_synonyms s, sys.all_objects o
where s.owner in (‘PUBLIC‘, :schema)
and o.owner = s.table_owner
and o.object_name = s.table_name
and o.object_type in (‘TABLE‘, ‘VIEW‘, ‘PACKAGE‘,‘TYPE‘,
‘PROCEDURE‘, ‘FUNCTION‘, ‘SEQUENCE‘)
-------------------------------------------------------------------------------
FINDINGS SECTION (3 findings)
-------------------------------------------------------------------------------
1- Statistics Finding
---------------------
Optimizer statistics for table "SYS"."IND$" and its indices are stale.
Recommendation
--------------
- Consider collecting optimizer statistics for this table.
execute dbms_stats.gather_table_stats(ownname => ‘SYS‘, tabname =>
‘IND$‘, estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => ‘FOR ALL COLUMNS SIZE AUTO‘);
Rationale
---------
The optimizer requires up-to-date statistics for the table in order to
select a good execution plan.
2- Statistics Finding
---------------------
Optimizer statistics for table "SYS"."USER$" and its indices are stale.
Recommendation
--------------
- Consider collecting optimizer statistics for this table.
execute dbms_stats.gather_table_stats(ownname => ‘SYS‘, tabname =>
‘USER$‘, estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => ‘FOR ALL COLUMNS SIZE AUTO‘);
Rationale
---------
The optimizer requires up-to-date statistics for the table in order to
select a good execution plan.
3- SQL Profile Finding (see explain plans section below)
--------------------------------------------------------
A potentially better execution plan was found for this statement.
The SQL profile was not automatically created because its benefit could not
be verified.
Recommendation (estimated benefit: 94.73%)
------------------------------------------
- Consider accepting the recommended SQL profile.
execute dbms_sqltune.accept_sql_profile(task_name =>
‘SYS_AUTO_SQL_TUNING_TASK‘, object_id => 3, replace => TRUE);
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------
1- Original With Adjusted Cost
------------------------------
-------------------------------------------------------------------------------
Error: cannot fetch explain plan for object: 3
-------------------------------------------------------------------------------
2- Original With Adjusted Cost
------------------------------
Plan hash value: 1687783800
--------------------------------------------------------------------------------
---------------------------------------------
| Id | Operation | Name | Ro
ws | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------
---------------------------------------------
| 0 | SELECT STATEMENT | |
4 | 464 | | 4999 (1)| 00:01:00 |
|* 1 | TABLE ACCESS BY INDEX ROWID | SUM$ |
1 | 6 | | 0 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | I_SUM$_1 |
1 | | | 0 (0)| 00:00:01 |
|* 3 | HASH JOIN | |
4 | 464 | | 4999 (1)| 00:01:00 |
| 4 | JOIN FILTER CREATE | :BF0000 | 3