2.5.1automaticsqlprofile调整执行计划
适合sql无法改写或验证改写是否成功的情况
验证:
Oracel账号SYS
Conn/assysdba;
1>createtablet1(nnumber);
2>declare
begin
foriin1..10000
loop
insertintot1values(i);
commit;
endloop;
end;
/
3>selectcount(*)fromt1;
4>createindexidx_t1ont1(n);
5>execdbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'T1',method_opt=>'forallcolumnssize1',cascade=>true);
6>select/*+no_index(t1idx_t1)*/*fromt1wheren=1;
7>select*fromtable(dbms_xplan.display_cursor(null,null,'advanced'));
8>declare
my_task_namevarchar2(30);
my_sqltextclob;
begin
my_sqltext:='select/*+no_index(t1idx_t1)*/*fromt1wheren=1';
my_task_name:=dbms_sqltune.create_tuning_task(
sql_text=>my_sqltext,
user_name=>'SYS',
scope=>'COMPREHENSIVE',
time_limit=>60,
task_name=>'my_sql_tuning_task_2',
description=>'Tasktoruneaqueryontablet1');
end;
/
9>begin
dbms_sqltune.execute_tuning_task(task_name=>'my_sql_tuning_task_2');
end;
/
10>
SQL>setlong9000
SQL>setlongchunksize1000
SQL>setlinesize800
SQL>selectdbms_sqltune.report_tuning_task('my_sql_tuning_task_2')fromdual;
GENERALINFORMATIONSECTION
-------------------------------------------------------------------------------
TuningTaskName:my_sql_tuning_task_2
TuningTaskOwner:SYS
WorkloadType:SingleSQLStatement
ExecutionCount:2
CurrentExecution:EXEC_277
ExecutionType:TUNESQL
Scope:COMPREHENSIVE
TimeLimit(seconds):60
CompletionStatus:COMPLETED
Startedat:04/17/201612:09:37
Completedat:04/17/201612:09:37
-------------------------------------------------------------------------------
SchemaName:SYS
SQLID:4bh6sn1zvpgq7
SQLText:select/*+no_index(t1idx_t1)*/*fromt1wheren=1
-------------------------------------------------------------------------------
FINDINGSSECTION(1finding)
-------------------------------------------------------------------------------
1-SQLProfileFinding(seeexplainplanssectionbelow)
--------------------------------------------------------
为此语句找到了性能更好的执行计划。
Recommendation(estimatedbenefit:95%)
---------------------------------------
-考虑接受推荐的SQL概要文件。
executedbms_sqltune.accept_sql_profile(task_name=>
'my_sql_tuning_task_2',task_owner=>'SYS',replace=>TRUE);
Validationresults
------------------
已对SQLprofile进行测试,方法为执行其计划和原始计划并测量与计划相对应的执行统计信息。如果其中一个计划运行在很短的时间内就完成,
则另一计划可能只执行了一部分。
OriginalPlanWithSQLProfile%Improved
---------------------------------------
CompletionStatus:COMPLETECOMPLETE
ElapsedTime(us):5976888.6%
CPUTime(us):00
UserI/OTime(us):00
BufferGets:20195%
PhysicalReadRequests:00
PhysicalWriteRequests:00
PhysicalReadBytes:00
PhysicalWriteBytes:00
RowsProcessed:11
Fetches:11
Executions:11
Notes
-----
1.originalplan已首先执行以预热缓冲区高速缓存。
2.originalplan的统计信息是后面的9执行的平均值。
3.SQLprofileplan已首先执行以预热缓冲区高速缓存。
4.theSQLprofileplan的统计信息是后面的9执行的平均值。
-------------------------------------------------------------------------------
EXPLAINPLANSSECTION
-------------------------------------------------------------------------------
1-OriginalWithAdjustedCost
------------------------------
Planhashvalue:3617692013
--------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
--------------------------------------------------------------------------
|0|SELECTSTATEMENT||1|4|7(0)|00:00:01|
|*1|TABLEACCESSFULL|T1|1|4|7(0)|00:00:01|
--------------------------------------------------------------------------
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-filter("N"=1)
2-UsingSQLProfile
--------------------
Planhashvalue:1369807930
---------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
---------------------------------------------------------------------------
|0|SELECTSTATEMENT||1|4|1(0)|00:00:01|
|*1|INDEXRANGESCAN|IDX_T1|1|4|1(0)|00:00:01|
---------------------------------------------------------------------------
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-access("N"=1)
-------------------------------------------------------------------------------
11>executedbms_sqltune.accept_sql_profile(task_name=>'my_sql_tuning_task_2',task_owner=>'SYS',replace=>TRUE);
12>再次执行select/*+no_index(t1idx_t1)*/*fromt1wheren=1;
select*fromtable(dbms_xplan.display_cursor(null,null,'advanced'));
原来走全表现在走索引范围range扫描了,起到了变更作用,但是,一旦sql参数值或其他变化就会改变这个已调整的automaticsqlprofile
13>验证参数值发生改变,又回到全表扫描了
select/*+no_index(t1idx_t1)*/*fromt1wheren=2;
select*fromtable(dbms_xplan.display_cursor(null,null,'advanced'));
SQL_IDc4j6hxkqudj1s,childnumber0
-------------------------------------
select/*+no_index(t1idx_t1)*/*fromt1wheren=2
Planhashvalue:3617692013
--------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
--------------------------------------------------------------------------
|0|SELECTSTATEMENT||||7(100)||
|*1|TABLEACCESSFULL|T1|1|4|7(0)|00:00:01|
--------------------------------------------------------------------------
QueryBlockName/ObjectAlias(identifiedbyoperationid):
-------------------------------------------------------------
1-SEL$1/T1@SEL$1
OutlineData
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
DB_VERSION('11.2.0.1')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
FULL(@"SEL$1""T1"@"SEL$1")
END_OUTLINE_DATA
*/
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-filter("N"=2)
ColumnProjectionInformation(identifiedbyoperationid):
-----------------------------------------------------------
1-"N"[NUMBER,22]
14>让automaticprofile永久生效添加force_match=true,默认force_match=false
executedbms_sqltune.accept_sql_profile(task_name=>'my_sql_tuning_task_2',task_owner=>'SYS',replace=>TRUE,force_match=>true);
注意SYS_SQLPROF_0154228b55fe000是否一样
SQL_IDfd5p89b5jz0ct,childnumber0
-------------------------------------
select/*+no_index(t1idx_t1)*/*fromt1wheren=4
Planhashvalue:1369807930
---------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
---------------------------------------------------------------------------
|0|SELECTSTATEMENT||||1(100)||
|*1|INDEXRANGESCAN|IDX_T1|1|4|1(0)|00:00:01|
---------------------------------------------------------------------------
QueryBlockName/ObjectAlias(identifiedbyoperationid):
-------------------------------------------------------------
1-SEL$1/T1@SEL$1
OutlineData
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
DB_VERSION('11.2.0.1')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
INDEX(@"SEL$1""T1"@"SEL$1"("T1"."N"))
END_OUTLINE_DATA
*/
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-access("N"=4)
ColumnProjectionInformation(identifiedbyoperationid):
-----------------------------------------------------------
1-"N"[NUMBER,22]
Note
-----
-SQLprofileSYS_SQLPROF_0154228b55fe0001usedforthisstatement
已选择46行。
SQL>select/*+no_index(t1idx_t1)*/*fromt1wheren=5;
N
----------
5
SQL>select*fromtable(dbms_xplan.display_cursor(null,null,'advanced'));
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID6u34k01s3c4rg,childnumber0
-------------------------------------
select/*+no_index(t1idx_t1)*/*fromt1wheren=5
Planhashvalue:1369807930
---------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
---------------------------------------------------------------------------
|0|SELECTSTATEMENT||||1(100)||
|*1|INDEXRANGESCAN|IDX_T1|1|4|1(0)|00:00:01|
---------------------------------------------------------------------------
QueryBlockName/ObjectAlias(identifiedbyoperationid):
-------------------------------------------------------------
1-SEL$1/T1@SEL$1
OutlineData
-------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
DB_VERSION('11.2.0.1')
ALL_ROWS
OUTLINE_LEAF(@"SEL$1")
INDEX(@"SEL$1""T1"@"SEL$1"("T1"."N"))
END_OUTLINE_DATA
*/
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-access("N"=5)
ColumnProjectionInformation(identifiedbyoperationid):
-----------------------------------------------------------
1-"N"[NUMBER,22]
Note
-----
-SQLprofileSYS_SQLPROF_0154228b55fe0001usedforthisstatement
已选择46行。
分享到:
相关推荐
Oracle执行计划参数解释,Oracle SQL优化的基础是看懂Oracle的执行计划,本文当系统整理了Oracle执行计划里面的各种参数。
基于规则的模式下,数据库的执行计划通常比较稳定。但在基于代价的模式下,我们才有更大的机会选择最优的执行计划。既然是基于代价的模式,也就是说执行计划的选择是根据表、索引等定义和数据的统计信息来决定的,这...
Oracle的执行计划,本文档说明了Oracle的执行计划,非原创,好东西再这里分项下
教你怎样看懂Oracle的执行计划。
Oracle的执行计划--下,Oracle的执行计划--下,Oracle的执行计划--下
针对Oracle性能的优化,了解sql语句的执行计划,对性能优化起到很好的指导作用!
Oracle执行计划详解,包括oracle执行顺序和索引详细介绍
Oracle的执行计划--上,Oracle的执行计划--上,Oracle的执行计划--上
大神专业讲解oracle执行计划,全面分析数据库执行计划的方方面面
SQL语句性能调整 ORACLE的执行计划.
ORACLE的执行计划详解,相信对大家有帮助
Oracle SQL执行计划分析器功能的创建3步曲: 1 首先,编译XYG_ALD_SESS_PKG的Package头。 (XYG_ALD_SESS_PKG.sql) 2 接着要建立好下面的4个视图对象。因为XYG_ALD_SESS_PKG包体会用到。(View Create Script v...
有关Oracle的执行计划中稳定性的描述,希望能对大家有所帮助
oracle执行计划详解,与大家分享自己平常积攒的一些资料,希望对想要学习oracle数据库的朋友有所帮助
教你如何生成、分析Oracle SQL执行计划,让SQL调优更轻松。
最全的6种oracle执行计划的方法,通过这些方法获取sql执行计划,进行优化
介绍oracle的执行计划概念,和如何对sql进行优化
Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义, 而是系统自己给加上的。对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值。不过你可以像使用其它列那样使用它,但是不能删除...
oracle 执行计划 建立与阅读 在进行语句性能分析时,提取语句执行计划,是重要的分析手段。Oracle数据库有多种获得执行计划方式,以下进行简要介绍