Oracle 11g开始提供一种新的固定执行计划方法SQL plan baseline。 名称是SQL执行计划基线(简称基线),被认为是OUTL
一、基础概念
Oracle 11g开始提供一种新的固定执行计划方法SQL plan baseline。 名称是SQL执行计划基线(简称基线),可以被认为是OUTLINE )或SQL PROFILE的改进版,其主要作用可归纳为以下两个:
1、稳定指定SQL语句的执行计划,避免执行环境和对象统计信息等因素的更改影响SQL语句的执行计划!
2、减少数据库中SQL语句性能下降的概率。 理论上,不允许把句子切换成比已经执行的执行计划晚很多的新的执行计划。
注意:
1、从甲骨文发展的角度来看,该方法估计是甲骨文发展和改进的方向。 目前,outline已经废弃,sql profile在后续版本中也很难改进。 因此,对于从11g接触Oracle的朋友来说,需要了解sql计划的基线。 因为这是今后的主流。
2、SQL执行计划基线存储在数据字典中,查询优化程序会自动确定使用它们。
Oracle教程:实例故障恢复
在Linux-6-64上安装Oracle 12C笔记本
在CentOS 6.4上安装Oracle11gr2(x64 )
Oracle 11gR2在VMWare虚拟机上的安装说明
在Debian上安装Oracle 11g XE R2
二、工作机制
从Oracle 11g开始,由于基线的存在,语句分析过程如下:
1 .在硬解析SQL语句之后,CBO (优化器)生成许多执行计划,CBO从中选择成本最低的执行计划之一。
2 .基于SQL语句的文本形成哈希值(signature ),该哈希值检查数据词典中是否存在相同的基线。
3 .如果存在基线,则优化程序会将刚生成的执行计划与存储在SQL plan baseline中的执行计划进行比较。
4 .如果基线中存在与CBO刚生成的执行计划相匹配的SQL执行计划,并且将其标记为可接受(“已接受”),则此CBO生成的执行计划将有效。
5 .如果没有与基线匹配的SQ执行计划,CBO将评估基线中标记为“已接受”的多个执行计划,并选择其中成本最低的执行计划。 (请注意,可以在一个语句的基线中存储多个执行计划。 这是与其他Outline和SQL profiel不同的地方。)
6 .如果在硬分析期间CBO选择的执行计划成本低于基线中存储的执行计划,则此新生成的执行计划将标记为“未接受”,并存储在基线中。 在这个执行计划进化并验证之前不会考虑使用。 即,accepted (进化和验证可以简单地理解为,Oracle确认了该执行计划会带来更好的性能。
这样,Oracle就不会降低SQL语句的性能。 也就是说,第一节中总结的第二个主要角色称为“运行计划维护选择策略”
三.基线特点
简单总结如下
由optimizer _ use _ SQL _ plan _ baseline控制Oracle是否使用基线。 默认值为TRUE,将自动使用。
缺省情况下,2.11g不会自动创建基线
与OUTLINE和SQL Profile不同,基线不存在分类概念
与OUTLINE和SQL Profile不同,可以为每个SQL语句设置多个基线。 Oracle根据您创建的规则,确定具体是哪个基线
5 .基线对RAC中的所有实例都有效
6 .基线有两种表现形式。 一个是sql_handle,可以理解为表示语句文本的唯一标识符。 另一个可以将sql_plan_name理解为执行计划的唯一标识符
不能像sql profile那样使用force_matching属性使用一个基线应用多个具有不同文字的SQL语句。
三、建立基线的几种方法
1 .通过自动捕获基线并将optimizer _ ca ture _ SQL _ plan _ baselines设置为true,优化程序生成并保存重复执行两次或多次的SQL语句的基线。 (可以在系统级或会话级更改) ) ) ) ) ) )。
2 .从SQL优化集合加载并使用软件包DBMS _ SPM.load _ plans _ from _ sqlset从SQL优化集合加载基线
DECLARE
l_plans_loaded PLS_INTEGER;
比根
l _ plans _ loaded :=DBMS _ SPM.load _ plans _ from _ sqlset (
sqlset_name='my_sqlset ' );
结束;
/
3、从库缓存加载,使用包DBMS _ SPM.load _ plans _ from _ cursor _ cache函数为已经位于光标缓存中的语句创建基线
DECLARE
p>l_plans_loaded PLS_INTEGER;
BEGIN
l_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache(sql_id => '1fkh93md0802n',plan_hash_value=>null);
END;
/
备注:可以有多种方式加载,例如可以根据sql文本进行模糊匹配、SQL语句解析的用户名等等方式,具体见文档
四、基线的几种状态
一个SQL语句对应的基线,我将它们归纳为三种状态
1.accepted(可接受),只有这种状态的基线,优化器才会考虑此基线中的执行计划
2.no-accepted(不可接受),这种状态的基线,优化器在SQL语句解析期间不会考虑。这种状态的基线必须通过演化和验证通过后,转变为accepted状态后,才会被优化器考虑使用
3.fixed为yes(固定),这种状态的基线固有最高优先级!比其他两类基线都要优先考虑
五、查看基线
1、基本视图:dba_sql_plan_baselines、dba_sql_management_config
2、底层视图:sqlobj$data 、 sqlobj$ (保存具体的hint),,如下查看基线中保存的执行计划语句:
select
extractvalue(value(d), '/hint') as outline_hints
from
xmltable('/outline_data/hint'
passing (
select
xmltype(comp_data) as xmlval
from
sqlobj$data sod, sqlobj$ so
where so.signature = sod.signature
and so.plan_id = sod.plan_id
and comp_data is not null
and name like '&baseline_plan_name'
)
) d;
3、通过函数来查看基线的详细信息:
select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle=>'SYS_SQL_11bcd50cd51504e9',plan_name=>'SQL_PLAN_13g6p1maja1790cce5f0e'));