B.从Shared SQL Area装载计划
要加载的Shared SQL区的计划,使用DBMS_SPM包的LOAD_PLANS_FROM_CURSOR_CACHE功能。在下面的示例中,Oracle数据库加载位于Shared SQL区的由SQL_ID确定的SQL计划:
DECLARE my_plans PLS_INTEGER; BEGIN my_plans:= DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID => '99twu5t2dn5xd'); END; /2.2 选择SQL Plan Baselines
在SQL Plan Baseline 选择阶段,Oracle数据库检测基于存储plan history的变化,选择计划以避免潜在的性能下降。
每次数据库编译SQL语句,优化器将执行以下操作:
使用基于成本的搜索方法(Cost-based search method)来构建一个最佳成本方案
试图在SQL Plan Baseline中找到一个匹配的计划
如果找到了,那么优化器进行使用匹配计划;如果没有找到,那么优化器将评估所有的SQL Plan baseline中的accepted SQL Plan,选择最低成本的SQL计划。
优化器找到的best-cost plan,如果不匹配该sql语句的plan history中的计划,那么该best-cost plan就是一个新的计划,数据库将添加这一计划作为nonaccepted计划到plan history。数据库不使用这个新的计划,直到它被证实不会导致性能下降。但是,如果一个系统变化(例如drop掉索引)会导致所有的accepted plan都不可用,这时优化器会选择该best-cost plan.因此,SQL Plan baseline会让优化器使用保守的计划选择策略。
若要使用SQL Plan Baseline,设置OPTIMIZER_USE_SQL_PLAN_BASELINES初始化参数为TRUE(默认值)。
2.3 evloving SQL PLAN baselines
在SQL Plan Baseline进化阶段,数据库评估新计划的性能,并将更好性能的Plan 集成到SQL Plan baseline中。
当优化程序发现一个SQL语句的新计划,数据库将添加该计划到plan history中,作为一个nonaccepted计划。数据库可以验证该计划相对于SQL Plan Baseline的性能表现。一个成功的验证过程包括将其与SQL Plan baseline比对,以及保证其可以deliver更好的性能。当数据库验证一个nonaccepted计划不会导致性能下降,数据库将其改为一个accepted plan,并将其集成到baseline中。
A.使用手动load Plan来进化plan
如2.1.2中所示,如果手工的从Shared SQL Area或者从SQL tuning set中load plan到SQL Plan baseline,则数据库会将这些计划作为accepted plan加入到SQLP Plan baseline中。
B.使用DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE进化计划
PL/SQL函数DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE会试图已经被优化器假如到plan history的新计划。如果函数可以验证新的计划比相应的SQL Plan baseline中的计划效果更好,那么数据库添加该新计划为一个accepted计划。
在下面的例子中,DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE 函数为一个由SQL句柄标示的SQL语句进化一个新的计划(SQL句柄是一个SQL唯一标示,以字符串形式标示)。您可以通过DBA_SQL_PLAN_BASELINES.SQL_HANDLE查询找到SQL句柄.
SET SERVEROUTPUT ON
SET LONG 10000
SET SERVEROUTPUT ON
SET LONG 10000
DECLARE
report clob;
BEGIN
report := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(
sql_handle => 'SYS_SQL_593bc74fca8e6738');
DBMS_OUTPUT.PUT_LINE(report);
END;
/ 备注:可以使用该函数来指定一个特殊的计划的名字、一组计划或者no value。如果是no value,则数据库会进化所有的nonaccepted plans.