您的位置:首页 > 数据库

官方文档: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加载
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到基线,文档写的过于冗长,可以找网上的迁移办法就行了.也可以自己参照文档来做,这里就写了,当做参考书看就好.这一章实在太长,后面就不翻译了........参考:http://docs.oracle.com/cd/E11882_01/server.112/e41573/optplanmgmt.htm#PFGRF95105

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: