首页 > 编程知识 正文

oracle数据库执行计划(at baseline)

时间:2023-05-06 00:18:17 阅读:71230 作者:2437

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'));

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。