分类: Oracle
2008-04-22 19:41:46
好消息是在Oracle11g中捕获SQL计划基线存储到SMB中一件相当容易的事情,首先,初始化参数OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES控制自动捕获SQL计划基线是否激活,这个参数的默认值是FALSE,意味着SQL计划基线不是自动捕获的,但是,一经DBA设置为TRUE(不管是在会话层还是在系统层),SPM就开始记录SQL语句的执行,当一条SQL语句不止被执行过一次时,该语句将被考虑作为SQL计划基线捕获候选者。
其次,一个新的Oracle11g包(DBMS_SPM)提供捕获和预先从几个源通过手动发送计划引入高性能SQL语句的能力:
◆在数据库当前缓存中发现了一个或多个SQL语句可以用于创建SQL计划基线,存储过程LOAD_PLANS_FROM_CURSOR_CACHE可以用于捕获任何库缓存(作为SMB的潜在候选者)中语句的子集。
◆存储在SQL调整集或一个AWR快照中的SQL语句可以被捕获并通过LOAD_PLANS_FROM_SQLSET存储过程翻译成SQL计划基线。
◆最后,SQL计划基线由外部输入转换表中的SQL语句衍生而来,这就意味着从一个完全不同的数据库捕获语句是可能的,也就是说,在一个QA环境中,预先在当前存储过程环境中种下它们。(我将在本系列文章的后面花费大量的时间讨论如何使其成为一个优秀的技术,以预防在数据库或应用程序升级过程中出现计划回退。)
查看SQL计划基线信息
在SMB中捕获的SQL计划基线元数据包括SPM属性和CBO计划控制,当一个新的而没有使用过的计划进入SMB后,它被标记为ENABLED,但是它不能标记为ACCEPTED,除非:(A)CBO已经评估了这个计划并将其视为最佳计划,或(B)这个计划已经演变成ACCEPTED模式。在CBO考虑使用某个执行计划前,它必须同时将其标记为ENABLED和ACCEPTED。
查看该元数据最简单的方法是查询DBA_SQL_PLAN_BASELINES数据字典视图,下面是该视图中大部分有价值的计划控制信息的摘要:
表1.1 SQL计划基线计划控制元数据 | |
属性 |
描述 |
SQL_HANDLE |
用字符串表示的SQL唯一性标识,它可以作为搜索关键字 |
PLAN_NAME |
用字符串表示的唯一的SQL计划,它可以作为搜索关键字 |
SQL_TEXT |
非正常SQL语句,实际上是文本 |
ORIGIN |
识别下面的SQL计划: l AUTO-CAPTURE:自动捕获 l MANUAL-LOAD:手动演变 l MANUAL-SQLTUNE:通过SQL调整顾问程序自动演变 l AUTO-SQLTUNE:通过自动SQL调整程序自动演变 |
ENABLED |
因为Oracle l 自动接受(accepted)它,或 l DBA通过存储过程DBMS_SPM.ALTER_SQL_PLAN_BASELINE()手动将它的状态强制设置为ACCEPTED |
FIXED |
SQL计划的FIXED属性被设置为YES将被视为使用CBO优化器,如果有多个计划被标记为FIXED,CBO将从这些标记了的计划中选择最佳的执行计划 |
OPTIMIZER_COST |
通过CBO使用这个执行计划执行SQL语句估量总体成本 |
另外一个查看执行一条SQL语句现存的SQL计划基线可能的影响的方法是通过新的DBMS_XPLAN包中的DISPLAY_SQL_PLAN_BASELINE存储过程实现的,例如:我可以用这个存储过程查看所有匹配SMB中的SQL语句的SQL计划基线,如果我也提供了该SQL语句计划的名字,那么它的执行计划也将同时显示出来。