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 执行计划详解" Oracle 执行计划是数据库性能优化的关键。为了更好地理解和优化 Oracle 数据库的执行计划,我们需要了解执行计划的生成过程、优化方法和执行计划的解读方法。 执行计划生成过程 执行计划的...
Oracle执行计划参数解释,Oracle SQL优化的基础是看懂Oracle的执行计划,本文当系统整理了Oracle执行计划里面的各种参数。
Oracle 执行计划详解 Oracle 执行计划是指 Oracle 数据库在执行查询语句时所采取的访问路径。了解执行计划对于优化查询语句、提高数据库性能至关重要。 什么是执行计划 执行计划是 Oracle 数据库在执行查询语句时...
本文档详细解释了 ORACLE 的执行计划背景知识,包括共享 SQL 语句、执行计划的存储和共享、绑定变量的使用、执行计划的生成和共享、执行计划的优化等方面的内容。 一、共享 SQL 语句 ORACLE 对相同的 SQL 语句进行...
Oracle数据库执行计划是数据库管理系统在处理SQL查询时所采用的一种策略,它决定了如何最有效地从数据库中检索数据。执行计划涉及到一系列的操作,包括数据的存取方法、索引的使用、连接操作以及优化器的选择。 ...
在深入了解Oracle执行计划之前,我们先来了解一下几个重要的概念,这些概念对于理解执行计划至关重要。 **共享SQL语句**:为了提高性能并减少资源消耗,Oracle在第一次解析某个SQL语句后,会将其以及相应的执行计划...
oracle 执行计划详解 Oracle 执行计划是数据库性能调整的关键部分,对于想要学习 Oracle 数据库的朋友非常有帮助。下面是Oracle 执行计划的背景知识和重要概念。 共享 SQL 语句 Oracle 将 SQL 语句及解析后得到的...
Oracle的执行计划--下,Oracle的执行计划--下,Oracle的执行计划--下
总之,Oracle执行计划的稳定性对于数据库的高效运行具有重要意义。通过合理管理统计信息、选择合适的优化器模式、利用SQL提示和监控工具,可以有效控制执行计划的稳定性,从而提升数据库的整体性能。
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 执行计划的详细解读,包括执行计划的定义、访问数据的方式、执行计划层次...
### Oracle 11g 执行计划管理详解 #### 引言 随着数据库系统的不断发展与完善,Oracle 11g 在数据库优化方面引入了一系列创新性功能。其中之一便是执行计划管理(SQL Plan Management)。这一特性旨在帮助数据库...
### Oracle如何使用AUTOTRACE查看执行计划 在Oracle数据库管理中,查看SQL语句的执行计划是一项重要的技能,这有助于优化查询性能、诊断性能问题等。AUTOTRACE是Oracle提供的一种强大的工具,用于自动展示SQL语句的...
本文将深入探讨Oracle的执行计划和表分区两个重要概念,以及它们如何影响数据库性能。 执行计划是Oracle数据库处理SQL查询的一种步骤序列,它详细描述了数据如何从表中提取、如何进行排序或聚合,以及如何返回到...
Oracle执行计划详解,包括oracle执行顺序和索引详细介绍
### Oracle执行计划分析 #### 一、概述 在Oracle数据库管理中,优化SQL查询性能是一项至关重要的任务。其中,理解并分析SQL执行计划是提升查询效率的关键步骤之一。执行计划是指Oracle数据库根据特定的SQL语句所...
Oracle SQL执行计划是指Oracle数据库为SQL语句制定的一系列执行步骤,这些步骤指导数据库如何高效地访问数据和执行SQL语句。执行计划对于Oracle数据库的性能调优至关重要,因为它能够揭示SQL语句的执行细节,帮助...