官方文档:11G新特性SQL PLAN BASLINE 执行计划基线
2014-07-06 21:22
453 查看
什么是SQL执行计划管理?
SQL计划管理(SQLplanmanagement)是一咱预防机制,记录和评估SQL语句的执行计划.SQLplanmanagement的主要功能是sqlplanbaseline.sqlplanbaseline某个SQL的执行计划的集合,这些执行计划经过验证,性能良好.
为什么要使用sqlbaseline?引入sqlbaseline的目的是无论数据库是否发生变化,都能保证SQL的性能(解决数据库发生变化时的性能问题).数据库的变化如:•Newoptimizerversion新版本的优化器•Changestooptimizerstatisticsandoptimizerparameters优化器状态和优化器参数发生变化•Changestoschemaandmetadatadefinitions模式和元数据的变化•Changestosystemsettings系统设置的变化•SQLprofilecreationSQL概要文件的变化ORACLE数据库有SQL调优(SQLtuning),但是对于突发的情况,SQLtuning无能为力,只有在这个SQL执行过之后SQLtuning才能进行优化,这时候就需要sqlbaseline.
应用SQLplanmanagement的情况:1.当数据库升级后,新版本的优化器可能导致性能问题.2.数据的变化引起执行执行计划改变,导致性能下降.3.在测试库上运行良好的SQL放到生产库可能会性能下降.这里把旧的执行计划加入sqlplanbaseline能稳定执行计划.sqlplanbaseline是一个SQL执行计划的集合,能够选择出最优的执行计划,从而最小程度减少性能回归.
SQLPlanBaselines的结构(ArchitectureofSQLPlanBaselines)SQLPlanBaselines里的执行计划包含以下内容:
Setofhints一系列的hints
Planhashvalue执行计划的hash值
Plan-relatedinformation执行计划相关的信息
执行计划历史(planhistory)是一个sql的执行计划历史的集合,包括已经被sqlplanbaseline接受和不被接受的.数据库只将重复出现的sql的执行计划记录到planhistory。将执行计划加入sqlplanbaseline的过程称为执行计划演化(planevolution).优化器生成第一个可以被sqlplanbaseline接受的plan,其余的plan将不加入sqlplanbaseline,必须通过演化才行。sqlplanhsitory和sqlplanbaseline的关系:
sql管理库SQLmanagementbase(SMB)是数据字典的一部分,保存了SQLplanbaselines、planhistory和sqlprofile,存放在sysaux表空间.数据库只将重复出现的sql的执行计划记录到planhistory。数据库会把SQL语句的ID写到一个日志文件,当这个SQL再出现时,数据库就会把它当作是重复的SQL语句。对于每个重复的SQL语句,数据库都会将优化器生成的执行计划记录下来。
将已经存在的执行计划加入sqlplanbaseline可以人为将plan加入到sqlplanbaeline中,数据库不会验证人为加入的plan的性能。1)从sqltuningset和AWR快照中载入sqlplan从sqltuningset加载
[/code]从AWR快照加载plan先将AWR快照加入sqltuningset,再执行上面的过程
2)从sqlarea加载plan(LoadingPlansfromtheSharedSQLArea)指定sqlid加入sqlplanbaesline:
[/code]通过以下方式可以确定一个sqlplan:SQLidentifier(SQL_ID)
SQLtext(SQL_TEXT)
Oneofthefollowingattributes:
PARSING_SCHEMA_NAME
MODULE
ACTION
选择SQLPLANBASELINE(SelectingSQLPlanBaselines)当数据库编译一个SQL时,优化器执行以下工作:Usesacost-basedsearchmethodtobuildabest-costplan使用基于成本(cost-based)的寻找方法建立plan
TriestofindamatchingplanintheSQLplanbaseline尝试在sqlplanbaseline中查找匹配的plan
Doeseitherofthefollowingdependingonwhetheramatchisfound:
Iffound,thentheoptimizerproceedsusingthematchedplan如果找到合适的plan,则使用这个plan
Ifnotfound,thentheoptimizerevaluatesthecostofeachacceptedplanintheSQLplanbaselineandselectstheplanwiththelowestcost如果没找到匹配的plan,则会评估sqlplanbaseline中的各个sqlplan,使用其中代价最小的plan
如果best-cost的plan跟planhistory中的任何计划都不匹配,会生成一个新的plan,并加入planhistory中,但是并不加入sqlplanbaseline中,也不会使用这个plan,而是使用上面步骤3中代价最小的plan.如果这时数据库发生改变,如删除了一个索引,导致所有sqlplanbaseline的执行计划失效,则会使用这个新计划,并加入sqlplanbaseline.启用sqlplanbaseline:设置参数optimizer_use_sql_plan_baselines为true
演化sqlplan(EvolvingSQLPlanBaselines)两种方式:手工演化和sqltuningadvisor手工演化:将plan从sqltuningset、AWR快照、sqlarea加载到sqlplanbaseline(上面已经介绍)或者用DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE:
[/code]输出:
[/code]用DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE可:A指定一个plan进行演化B选择一个plan列表进行演化C不指定任何值,则演化SMB中的任何执行计划
用sqltuningadvisor进行演化:在用sqltuningadvsor进行sql调试时,会生成一个sqlprofile文件.如果这个sqlprofile的性能比sqlplanbaseline里的好时,sqltuningadvisor会建议将这个plan加入sqlplanbaseline中.在11G中,自动维护窗口(maintenancewindow)有一个自动维护任务,这个任务是目的是从AWR中找到负载最高的SQL,然后找到该SQL已经被sqltuningadvisor验证过性能的plan加入到sqlplanbaseline.
固定执行计划基线(UsingFixedSQLPlanBaselines)当一个基线里有一个plan被设置为fixed时,这个基线是固定的.一个基线里可以有固定和非固定的计划,但是优化器只会使用固定的计划.对于某些情况比较有用,如从10G升级到11G后,性能下降,即使使用了基线也不行,这时将10G的执行计划导入到基线里,并设置为固定的,可以防止使用错误的执行计划,类似于10G的outline.当fixed的plan变的不可用时(如删除了索引),才会考虑非fixed的plan优化器不会向fixed的基线中加入新的plan(优化器仅仅会在sql第一次运行时向基线加入一个plan).
展示基线(DisplayingSQLPlanBaselines)用sqlhandle展示一个或多个基线计划
[/code]或者用name参数只展示一个计划
[/code]DBA_SQL_PLAN_BASELINES可以查看基线的信息
[/code]
SQL管理库SQLManagementBase
SMB是数据字典的一部分,放在SYSAUX表空间,保存了sql语句的日志、执行计划历史、基线和sqlprofile。SMB用自动空间管理(automaticspacemanagement)来删除不再使用的计划和日志。SMB在SYSAUX表空间上默认使用的空间不超过10%,最大可以调到50%.当超过可以使用的空间时,会在警告日志中写一条警告,直到表空间增大、SBM在SYSAUX上的配额增大、或者SBM减少到正常水平后才消失。设置SBM大小:
[/code]自动删除执行计划:当一个计划超过53周没有使用时,自动维护窗口会删除这个计划。这个期限可以是5-523周。设置期限:
[/code]
导出导入基线:首先用下面的创建一个中转表:
[/code]把基线打包放到表里:
[/code]然后用EXPDP和IMPDP工具迁移到目标数据库上。然后解压包:
[/code]这样就可以了
迁移OUTLINEoutline是10G里用于稳定执行计划用的。首先了解outline的一些缺点:1.OUTLINE不会随着时间自动演化,当环境变化时性能可能变差。2.OUTLINE里的hints可能会失效如索引删除等。此种情况下,数据库依然会使用这个错误的hints导致性能低下。3.优化器仅仅会使用某一类别的OUTLINE,即使有更好的也不使用。基线的优点:1.随着环境变化演化执行计划,保证执行计划是可靠的。、2.不会使用错误的hints3.可以使用多个执行计划而非不像OUTLINE只能使用一个。迁移OUTLINE到baseline的步骤:
、1.用户执行函数选定要迁移的outline2.数据库从outline复制信息到baseline3.数据库重新为获取hints的信息4.在sql第一次运行时重新获取其它丢失的信息
后面的内容是迁移outline到基线,文档写的过于冗长,可以找网上的迁移办法就行了.也可以自己参照文档来做,这里就写了,当做参考书看就好.这一章实在太长,后面就不翻译了........参考:http://docs.oracle.com/cd/E11882_01/server.112/e41573/optplanmgmt.htm#PFGRF95105
来自为知笔记(Wiz)
SQL计划管理(SQLplanmanagement)是一咱预防机制,记录和评估SQL语句的执行计划.SQLplanmanagement的主要功能是sqlplanbaseline.sqlplanbaseline某个SQL的执行计划的集合,这些执行计划经过验证,性能良好.
为什么要使用sqlbaseline?引入sqlbaseline的目的是无论数据库是否发生变化,都能保证SQL的性能(解决数据库发生变化时的性能问题).数据库的变化如:•Newoptimizerversion新版本的优化器•Changestooptimizerstatisticsandoptimizerparameters优化器状态和优化器参数发生变化•Changestoschemaandmetadatadefinitions模式和元数据的变化•Changestosystemsettings系统设置的变化•SQLprofilecreationSQL概要文件的变化ORACLE数据库有SQL调优(SQLtuning),但是对于突发的情况,SQLtuning无能为力,只有在这个SQL执行过之后SQLtuning才能进行优化,这时候就需要sqlbaseline.
应用SQLplanmanagement的情况:1.当数据库升级后,新版本的优化器可能导致性能问题.2.数据的变化引起执行执行计划改变,导致性能下降.3.在测试库上运行良好的SQL放到生产库可能会性能下降.这里把旧的执行计划加入sqlplanbaseline能稳定执行计划.sqlplanbaseline是一个SQL执行计划的集合,能够选择出最优的执行计划,从而最小程度减少性能回归.
SQLPlanBaselines的结构(ArchitectureofSQLPlanBaselines)SQLPlanBaselines里的执行计划包含以下内容:
Setofhints一系列的hints
Planhashvalue执行计划的hash值
Plan-relatedinformation执行计划相关的信息
执行计划历史(planhistory)是一个sql的执行计划历史的集合,包括已经被sqlplanbaseline接受和不被接受的.数据库只将重复出现的sql的执行计划记录到planhistory。将执行计划加入sqlplanbaseline的过程称为执行计划演化(planevolution).优化器生成第一个可以被sqlplanbaseline接受的plan,其余的plan将不加入sqlplanbaseline,必须通过演化才行。sqlplanhsitory和sqlplanbaseline的关系:
sql管理库SQLmanagementbase(SMB)是数据字典的一部分,保存了SQLplanbaselines、planhistory和sqlprofile,存放在sysaux表空间.数据库只将重复出现的sql的执行计划记录到planhistory。数据库会把SQL语句的ID写到一个日志文件,当这个SQL再出现时,数据库就会把它当作是重复的SQL语句。对于每个重复的SQL语句,数据库都会将优化器生成的执行计划记录下来。
将已经存在的执行计划加入sqlplanbaseline可以人为将plan加入到sqlplanbaeline中,数据库不会验证人为加入的plan的性能。1)从sqltuningset和AWR快照中载入sqlplan从sqltuningset加载
DECLARE
my_plansPLS_INTEGER;
BEGIN
my_plans:=DBMS_SPM.LOAD_PLANS_FROM_SQLSET(sqlset_name=>'tset1');
END;
/
[/code]从AWR快照加载plan先将AWR快照加入sqltuningset,再执行上面的过程
2)从sqlarea加载plan(LoadingPlansfromtheSharedSQLArea)指定sqlid加入sqlplanbaesline:
DECLARE
my_plansPLS_INTEGER;
BEGIN
my_plans:=DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id=>'99twu5t2dn5xd');
END;
/
[/code]通过以下方式可以确定一个sqlplan:SQLidentifier(SQL_ID)
SQLtext(SQL_TEXT)
Oneofthefollowingattributes:
PARSING_SCHEMA_NAME
MODULE
ACTION
选择SQLPLANBASELINE(SelectingSQLPlanBaselines)当数据库编译一个SQL时,优化器执行以下工作:Usesacost-basedsearchmethodtobuildabest-costplan使用基于成本(cost-based)的寻找方法建立plan
TriestofindamatchingplanintheSQLplanbaseline尝试在sqlplanbaseline中查找匹配的plan
Doeseitherofthefollowingdependingonwhetheramatchisfound:
Iffound,thentheoptimizerproceedsusingthematchedplan如果找到合适的plan,则使用这个plan
Ifnotfound,thentheoptimizerevaluatesthecostofeachacceptedplanintheSQLplanbaselineandselectstheplanwiththelowestcost如果没找到匹配的plan,则会评估sqlplanbaseline中的各个sqlplan,使用其中代价最小的plan
如果best-cost的plan跟planhistory中的任何计划都不匹配,会生成一个新的plan,并加入planhistory中,但是并不加入sqlplanbaseline中,也不会使用这个plan,而是使用上面步骤3中代价最小的plan.如果这时数据库发生改变,如删除了一个索引,导致所有sqlplanbaseline的执行计划失效,则会使用这个新计划,并加入sqlplanbaseline.启用sqlplanbaseline:设置参数optimizer_use_sql_plan_baselines为true
演化sqlplan(EvolvingSQLPlanBaselines)两种方式:手工演化和sqltuningadvisor手工演化:将plan从sqltuningset、AWR快照、sqlarea加载到sqlplanbaseline(上面已经介绍)或者用DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE:
SETSERVEROUTPUTON
SETLONG10000
DECLARE
reportclob;
BEGIN
report:=DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(
sql_handle=>'SYS_SQL_593bc74fca8e6738');
DBMS_OUTPUT.PUT_LINE(report);
END;
/
[/code]输出:
REPORT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
EvolveSQLPlanBaselineReport
--------------------------------------------------------------------------------
Inputs:
-------
SQL_HANDLE=SYS_SQL_593bc74fca8e6738
PLAN_NAME=
TIME_LIMIT=DBMS_SPM.AUTO_LIMIT
VERIFY=YES
COMMIT=YES
Plan:SYS_SQL_PLAN_ca8e6738a57b5fc2
-----------------------------------
Planwasverified:Timeused.07seconds.
Passedperformancecriterion:Compoundimprovementratio>=7.32.
Planwaschangedtoanacceptedplan.
BaselinePlanTestPlanImprov.Ratio
-----------------------------------
ExecutionStatus:COMPLETECOMPLETE
RowsProcessed:4040
ElapsedTime(ms):2382.88
CPUTime(ms):2382.88
BufferGets:450617.38
DiskReads:00
DirectWrites:00
Fetches:00
Executions:11
-------------------------------------------------------------------------------
ReportSummary
-------------------------------------------------------------------------------
NumberofSQLplanbaselinesverified:1.
NumberofSQLplanbaselinesevolved:1.
HideNavigation
Search
AdvancedSearch
Reference
Home·MasterIndex·MasterGlossary·BookList·DataDictionary·SQLKeywords·Acronyms·InitializationParameters·ErrorMessages
Categories
Installation
GettingStarted
Administration
ApplicationDevelopment
GridComputing
HighAvailability
DataWarehousing
ContentManagementandUnstructuredData
InformationIntegration
Security
Videos
Newandchangeddocuments
[/code]用DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE可:A指定一个plan进行演化B选择一个plan列表进行演化C不指定任何值,则演化SMB中的任何执行计划
用sqltuningadvisor进行演化:在用sqltuningadvsor进行sql调试时,会生成一个sqlprofile文件.如果这个sqlprofile的性能比sqlplanbaseline里的好时,sqltuningadvisor会建议将这个plan加入sqlplanbaseline中.在11G中,自动维护窗口(maintenancewindow)有一个自动维护任务,这个任务是目的是从AWR中找到负载最高的SQL,然后找到该SQL已经被sqltuningadvisor验证过性能的plan加入到sqlplanbaseline.
固定执行计划基线(UsingFixedSQLPlanBaselines)当一个基线里有一个plan被设置为fixed时,这个基线是固定的.一个基线里可以有固定和非固定的计划,但是优化器只会使用固定的计划.对于某些情况比较有用,如从10G升级到11G后,性能下降,即使使用了基线也不行,这时将10G的执行计划导入到基线里,并设置为固定的,可以防止使用错误的执行计划,类似于10G的outline.当fixed的plan变的不可用时(如删除了索引),才会考虑非fixed的plan优化器不会向fixed的基线中加入新的plan(优化器仅仅会在sql第一次运行时向基线加入一个plan).
展示基线(DisplayingSQLPlanBaselines)用sqlhandle展示一个或多个基线计划
SELECT*FROMTABLE(
DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(
sql_handle=>'SYS_SQL_209d10fabbedc741',
format=>'basic'));
HideNavigation
Search
AdvancedSearch
Reference
Home·MasterIndex·MasterGlossary·BookList·DataDictionary·SQLKeywords·Acronyms·InitializationParameters·ErrorMessages
Categories
Installation
GettingStarted
Administration
ApplicationDevelopment
GridComputing
HighAvailability
DataWarehousing
ContentManagementandUnstructuredData
InformationIntegration
Security
Videos
Newandchangeddocuments
[/code]或者用name参数只展示一个计划
SQLhandle:SYS_SQL_209d10fabbedc741
SQLtext:selectcust_last_name,amount_soldfromcustomersc,
salesswherec.cust_id=s.cust_idandcust_year_of_birth=:yob
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
Planname:SYS_SQL_PLAN_bbedc741a57b5fc2
Enabled:YESFixed:NOAccepted:NOOrigin:AUTO-CAPTURE
----------------------------------------------------------------------------------
Planhashvalue:2776326082
----------------------------------------------------------------------------------
|Id|Operation|Name|
----------------------------------------------------------------------------------
|0|SELECTSTATEMENT||
|1|HASHJOIN||
|2|TABLEACCESSBYINDEXROWID|CUSTOMERS|
|3|BITMAPCONVERSIONTOROWIDS||
|4|BITMAPINDEXSINGLEVALUE|CUSTOMERS_YOB_BIX|
|5|PARTITIONRANGEALL||
|6|TABLEACCESSFULL|SALES|
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
Planname:SYS_SQL_PLAN_bbedc741f554c408
Enabled:YESFixed:NOAccepted:YESOrigin:MANUAL-LOAD
----------------------------------------------------------------------------------
Planhashvalue:4115973128
----------------------------------------------------------------------------------
|Id|Operation|Name|
----------------------------------------------------------------------------------
|0|SELECTSTATEMENT||
|1|NESTEDLOOPS||
|2|NESTEDLOOPS||
|3|TABLEACCESSBYINDEXROWID|CUSTOMERS|
|4|BITMAPCONVERSIONTOROWIDS||
|5|BITMAPINDEXSINGLEVALUE|CUSTOMERS_YOB_BIX|
|6|PARTITIONRANGE||
|7|BITMAPCONVERSIONTOROWIDS||
|8|BITMAPINDEXSINGLEVALUE|SALES_CUST_BIX|
|9|TABLEACCESSBYLOCALINDEXROWID|SALES|
----------------------------------------------------------------------------------
[/code]DBA_SQL_PLAN_BASELINES可以查看基线的信息
SELECTSQL_HANDLE,PLAN_NAME,ENABLED,ACCEPTED,FIXED
FROMDBA_SQL_PLAN_BASELINES;
SQL_HANDLEPLAN_NAMEENAACCFIX
------------------------------------------------------------------------
SYS_SQL_209d10fabbedc741SYS_SQL_PLAN_bbedc741a57b5fc2YESNONO
SYS_SQL_209d10fabbedc741SYS_SQL_PLAN_bbedc741f554c408YESYESNO
[/code]
SQL管理库SQLManagementBase
SMB是数据字典的一部分,放在SYSAUX表空间,保存了sql语句的日志、执行计划历史、基线和sqlprofile。SMB用自动空间管理(automaticspacemanagement)来删除不再使用的计划和日志。SMB在SYSAUX表空间上默认使用的空间不超过10%,最大可以调到50%.当超过可以使用的空间时,会在警告日志中写一条警告,直到表空间增大、SBM在SYSAUX上的配额增大、或者SBM减少到正常水平后才消失。设置SBM大小:
BEGIN
DBMS_SPM.CONFIGURE('space_budget_percent',30);
END;
/
[/code]自动删除执行计划:当一个计划超过53周没有使用时,自动维护窗口会删除这个计划。这个期限可以是5-523周。设置期限:
BEGIN
DBMS_SPM.CONFIGURE('plan_retention_weeks',105);
END;
/
[/code]
导出导入基线:首先用下面的创建一个中转表:
BEGIN
DBMS_SPM.CREATE_STGTAB_BASELINE(
table_name=>'stage1');
END;
/
[/code]把基线打包放到表里:
DECLARE
my_plansnumber;
BEGIN
my_plans:=DBMS_SPM.PACK_STGTAB_BASELINE(
table_name=>'stage1',
enabled=>'yes',
creator=>'dba1');
END;
/
[/code]然后用EXPDP和IMPDP工具迁移到目标数据库上。然后解压包:
DECLARE
my_plansnumber;
BEGIN
my_plans:=DBMS_SPM.UNPACK_STGTAB_BASELINE(
table_name=>'stage1',
fixed=>'yes');
END;
/
[/code]这样就可以了
迁移OUTLINEoutline是10G里用于稳定执行计划用的。首先了解outline的一些缺点:1.OUTLINE不会随着时间自动演化,当环境变化时性能可能变差。2.OUTLINE里的hints可能会失效如索引删除等。此种情况下,数据库依然会使用这个错误的hints导致性能低下。3.优化器仅仅会使用某一类别的OUTLINE,即使有更好的也不使用。基线的优点:1.随着环境变化演化执行计划,保证执行计划是可靠的。、2.不会使用错误的hints3.可以使用多个执行计划而非不像OUTLINE只能使用一个。迁移OUTLINE到baseline的步骤:
、1.用户执行函数选定要迁移的outline2.数据库从outline复制信息到baseline3.数据库重新为获取hints的信息4.在sql第一次运行时重新获取其它丢失的信息
后面的内容是迁移outline到基线,文档写的过于冗长,可以找网上的迁移办法就行了.也可以自己参照文档来做,这里就写了,当做参考书看就好.这一章实在太长,后面就不翻译了........参考:
相关文章推荐
- 11G新特性SQL PLAN BASLINE 执行计划基线
- 11g新特性SQL执行计划管理(SQL Plan Management) (1)
- Oracle SQL执行计划基线总结(SQL Plan Baseline)
- Oracle SQL执行计划基线总结(SQL Plan Baseline)
- Oracle SQL执行计划基线总结(SQL Plan Baseline)
- oracle 11g BaseLine(基线)指定application中不可修改sql的执行计划
- v$sql_plan看到不执行计划
- 简单讨论在11G,10G中如何稳定SQL执行计划(一)
- Oracle 11g 新特性 -- SQL Plan Management 示例
- Scrips:打印AWR中执行计划的改变awr_plan_change.sql
- Oracle 11g 新特性 -- SQL Plan Management 说明
- 点评Oracle 11g新特性之执行计划管理
- 察看执行计划和sql跟踪工具之explain plan
- Oracle 性能调优之:使用 V$SQL_PLAN 视图查询内存中的执行计划
- Scripts:打印执行计划中AWR的执行计划信息awr_plan_stats.sql
- Oracle 11g 新特性 -- SQL Plan Management 详细说明
- Oracle 11g 新特性 -- SQL Plan Management 说明
- Oracle 11g 新特性 -- SQL Plan Management 说明
- Oracle 11g 新特性 -- SQL Plan Management 示例
- 格式化v$sql_plan查看实际执行计划