重庆oracle认证培训机构

新闻分类

产品分类

热门关键词

联系我们

企业名称:重庆科禄德科技有限公司

联系人:冷老师

手机:17754917523

邮箱:93865813@qq.com

网址:www.cqora.com

地址:重庆石桥铺高创锦业

Oracle数据库“SQL基线”详解及操作过程的工作机制

您的当前位置: 首 页 >> 新闻资讯 >> 行业新闻

Oracle数据库“SQL基线”详解及操作过程的工作机制

发布日期:2021-06-04 作者: 点击:

Oracle数据库“SQL基线”详解及操作过程的工作机制

从Oracle 11g開始,因为基线的存在,一条语句的解析过程大概例如以下:

1.SQL语句被硬解析后。CBO(优化器)会产生非常多个的运行计划。CBO从中选择一个成本最低运行计划。

2.基于SQL语句的文本形成一个哈希值(signature),通过这个哈希值来检查数据字典中是否存在相同的基线。

3.假设基线存在,优化器会对刚刚产生的运行计划和保存在SQL plan baseline中的运行计划进行比較。

4.假设基线中有与CBO刚产生的运行计划的匹配的SQL运行计划存在。而且被标记为可接受(‘accepted’)。则这个CBO生成的运行计划被启用。

5.假设基线中没有匹配的SQ运行计划存在,CBO评估基线中被标记为‘accepted’的的多个运行计划。并选择当中cost最低的运行计划。(注意,一个语句的基线能够有多个运行计划被保存,这是与其它Outline和SQL profiel都不同的地方)

6.假设刚刚硬解析过程中CBO选择的运行计划比保存在基线中的运行计划COST都低,这个新生成的运行计划被标记为‘not-accepted’并保存在基线中。

直到这个运行计划被演化且验证后才会被考虑使用,即标记为accepted(演化和验证。能够简单理解为Oracle确认这个运行计划能够带来更好的性能)。

Oracle 就是通过上面这样的方式来确保SQL语句的性能不会退化(即第一部分中我归纳的第二个主要作用),称为“运行计划保守选择策略”

3

基线的一些特点

简单归纳例如以下几个

1.通过OPTIMIZER_USE_SQL_PLAN_BASELINE来控制Oracle是否使用基线,默认值为TRUE。即会自己主动使用基线。

2.11g中默认是不会自己主动创建基线

3.与OUTLINE和SQL Profile不同,基线中不存在分类的概念

4.与OUTLINE和SQL Profile不同。每一个SQL语句能够有多个基线。

Oracle依据制定的规则来推断详细是否哪个基线


1.基线针对RAC中全部的实例都生效

2.基线有两个表示,一个为sql_handle。能够理解为表示语句文本的唯一标识,一个为sql_plan_name能够理解为运行计划的唯一标识

3.不能像sql profile一样通过force_matching属性将字面值不一样的SQL语句使用一个基线应用多个语句。

4

创建基线的几种方式

1、自己主动捕获基线。通过将optimizer_cature_sql_plan_baselines设置为true。优化器为反复运行两次以上的SQL语句生成并保存基线(能够系统级或会话级改动)

2、从SQL调优集合中载入。通过使用包dbms_spm.load_plans_from_sqlset来从SQL调优集合中载入基线

DECLARE

  l_plans_loaded  PLS_INTEGER;

BEGIN

  l_plans_loaded := DBMS_SPM.load_plans_from_sqlset(

    sqlset_name => 'my_sqlset');

END;

/

3、从库缓存中载入,通过包dbms_spm.load_plans_from_cursor_cache函数为一条已经在游标缓存中的语句创建基线

DECLARE

  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语句解析的username等等方式,详细见文档

5

基线的几种状态

一个SQL语句相应的基线,我将它们归纳为三种状态

accepted(可接受),仅仅有这样的状态的基线,优化器才会考虑此基线中的运行计划

no-accepted(不可接受)。这样的状态的基线,优化器在SQL语句解析期间不会考虑。这样的状态的基线必须通过演化和验证通过后,转变为accepted状态后。才会被优化器考虑使用

fixed为yes(固定),这样的状态的基线固有最高优先级!

比其它两类基线都要优先考虑


6

查看基线

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

7

演化基线

为了验证基线中一个处于不可接受状态的运行计划是否比一个处于可接受状态的运行计划具有更高的效率。必须通过演化来验证,须要让优化器以不同的运行计划来运行这条SQL语句。观察不可接受状态的运行计划基线是否会带来更好的性能,假设性能确实更高,这个不可接受状态的基线将会转换为可接受状态。演化的方式有两种:

1、手工执行执行

SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => 'SYS_SQL_xxxxxxxxxxxxx') From dual;

还有time_limit/verify/commit几个參数,能够參考文档

2、调优包实现基线的自己主动演化,能够理解为,启动一个调度任务,周期性的检查是否有不可接受状态的基线能够被演化

8

改动基线

能够通过dbms_spm.alter_sql_plan_baseline包来改动基线的一些属性。主要有例如以下几个属性

ENABLED :设置该属性的值为NO告诉Oracle 11g暂时禁用某个计划,一个SQL计划必须同一时候标记为ENABLED和ACCEPTED,否则CBO将忽略它

FIXED:设置为YES,那个计划将是优化器唯一的选择[最高优先级]。即使假设某个计划可能拥有更低的成本。这让DBA能够撤销SMB的默认行为,对于转换一个存储概要进入一稳定的SQL计划基线特别实用,注意当一个新计划被加入到被标记为FIXED的SQL计划基线,该新计划不能被利用除非它申明为FIXED状态

AUTOPURG:设置这个属性的值为NO告诉Oracle 11g无限期保留它。从而不用操心SMB的自己主动清除机制

plan_name : 改变SQL plan 名字

description : 改变SQL plan描写叙述

语法:

SET SERVEROUTPUT ON

DECLARE

 v_text  PLS_INTEGER;

BEGIN

 v_text  := DBMS_SPM.alter_sql_plan_baseline(sql_handle  => 'SYS_SQL_xxxxxx',plan_name => 'SYS_SQL_PLAN_xxxxxxxxx',

      attribute_name  => 'fixed',attribute_value => 'YES');

  DBMS_OUTPUT.put_line('Plans Altered: ' || v_text  );

END;

/

9

迁移基线

dbms_spm提供了多个过程来在数据库之间迁移SQL计划基线

create_stgtab_baseline创建一个计划基线保存表

pack_stgtab_baseline将基线从数据字典拷贝到第一步的表中

unpack_stgtab_baseline将基线从保存表中拷贝到迁移数据库的数据字典中

大概步骤例如以下:

1、创建一张保存数据字典中基线表内容的用户表

exec dbms_spm.create_stgtab_baseline(table_name => 'BASELINE_TEST',table_owner => 'SCOTT',tablespace_name =>'');

2、将数据字典中基线表的内容 插入到 第一步创建的用户表中

exec :i := dbms_spm.pack_stgtab_baseline(table_name => 'BASELINE_TEST', table_owner => 'SCOTT');  

备注:能够支持多种方式插入,比如包括特定字符的SQL相关的基线。sql_handle来精确识别一个基线,详细见文档

3、通过迁移工具迁移用户表

exp/imp or expdp/impdp

4、将迁移过来的用户表中保存的基线内容 插入到当前库的数据字典中。从而实现迁移

exec :i := dbms_spm.unpack_stgtab_baseline(table_name => 'BASELINE_TEST',table_owner => 'SCOTT');

备注:能够支持多种方式,与步骤2一样。详细见文档

10

删除基线

能够通过dbms_SPM.drop_sql_plan_baseline包来手工删除数据字典里的基线

为使用的基线。fixed为no的基线,将在一定的保留期后自己主动删除(可查看dba_sql_management_config视图)

手工删除方法例如以下

SET SERVEROUTPUT ON

DECLARE

  v_text  PLS_INTEGER;

BEGIN

  v_text := DBMS_SPM.drop_sql_plan_baseline(sql_handle => 'SYS_SQL_7b76323ad90440b9',plan_name  => NULL); 

  DBMS_OUTPUT.put_line(v_text);

END;

/

11

将一个SQL语句固定为我们期望的运行计划

我一般通过例如以下几步实现(仅供參考)

1、为这个SQL语句创建基线

2、给这个SQL语句加入hint赖宇星,确保SQL语句加入hint后的运行计划与我们期望一样

3、将第2步产生的运行计划。加入到第一步创建的基线中(注意,前面已经说过,一个SQL语句能够有多个基线。)

4、删除基线中第1步创建的那个运行计划(这样,我们就能够确保基线中仅仅有我们期望的运行计划,即保存第2步SQL语句的运行计划)

5、验证是否生效

兴许有演示样例。加深理解!


本文网址:http://www.cqora.com/news/796.html

关键词:oracle认证培训机构,Oracle认证培训,Oracle培训公司

最近浏览:

报名咨询

点击咨询报名

QQ群

赛烽达技术群

冷老师

17754917523

加微信咨询

张老师微信.jpg

93865813@qq.com