oracle SQL计划管理 2
1.1.1.1 捕获SQL计划基线
可以通过几个步骤来捕获新的SQL计划基线。基本上,它们是由数据库引擎自动创建的,或由数据库管理员或开发人员手动创建。下面三部分分别介绍了三种方法。
Ø 自动捕获
将初始化参数optimizer_capture_sql_plan_baselines设置为TRUE时,查询优化器会自动保存新的SQL计划基线。默认情况下,会将初始化参数设置为FALSE。可以在会话和系统级别更改它。
启用自动捕获时,查询优化会为每条多次执行(即至少执行两次)的SQL语句保存新的SQL计划基线。为此,它会在SQL基础管理平台中管理一个日志来插入每条它处理的SQL语句签名。这代表某一SQL语句第一次执行后,它的签名仅会插入日志。然后,当同一个SQL语句第二次执行时,会创建仅包含当前执行计划的SQL计划基线并且标记为接受。从第三次执行开始,由于SQL计划基线已经与SQL语句相关联,因此查询优化器还会比较当前执行计划与SQL计划基线生成的执行计划。
如果它们不匹配,这代表根据当前查询优化器的估算,最优的执行计划并不是存储在SQL计划基线中的那个。为了保存这个信息,会将当前执行计划添加到SQL计划基线中并且标记为不接受。然而,就像你之前看到的那样,当前执行计划无法使用。会强制查询优化器使用SQL计划基线生成的执行计划。图11-9总结了整个处理过程。
图11-9 自动捕获SQL计划基线期间执行的主要步骤
将某个新的执行计划存储到SQL计划基线中时,重点需要区分以下两种情况。
Ø 如果这是SQL计划基线的第一个执行计划,则会将执行计划存储为接受,因此,查询优化器将能够使用它。
Ø 如果这不是SQL计划基线的第一个执行计划,则会将它存储为不接受,因此,查询优化器无法使用它。“进化SQL计划基线”部分将介绍如何使SQL计划基线生效,以使其对查优化器可用。
Ø 从库缓存中加载
要基于存储在库缓存中的游标手动将SQL计划基线加载进数据字典中,可以使用dbms_spm包下的load_plans_from_cursor_cache函数。
实际上,会多次重载函数来支持确定必须处理哪些游标的不同方法。这包含两种主要的可能。第一,通过指定以下属性之一来标识多个SQL语句。
Ø sql_text:SQL语句的文本。这个属性支持通配符(例如%)。
Ø parsing_schema_name:用来解析游标的模式名称。
Ø module:执行SQL语句的模块名称。
Ø action:执行SQL语句的动作名称。
举例说明,下面的调用引用自baseline_from_sqlarea1.sql脚本,为存储在库缓存中包含注释MysqlStm字符串的每个SQL语句创建SQL计划基线:
ret:= dbms_spm.load_plans_from_cursor_cache(attribute_name =>'sql_text',attribute_value =>'%/* MysqlStm */%');