15 sql base line 工作机制

<个人Configuration>
    正常配置一下, 就OK了, 不用理了, oracle 11g 默认启动
发展:
    1、从Oracle的发展角度来看,估计这种方法是Oracle发展和改进的方向,如今outline已经被废弃,sql profile
        估计在后续的发行版本中也难有改进,因此,对于从11g开始接触Oracle的朋友来说,一定要对sql计划基线有
        所了解,因为这是以后的主流!
    2、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语句的性能不会退化(即第一部分中我归纳的第二个主要作用),称为“执行计划保守选择策略”

基线的一些特点
    1.通过OPTIMIZER_USE_SQL_PLAN_BASELINE来控制Oracle是否使用基线,默认值为TRUE,即会自动使用基线。
    2.11g中默认是不会自动创建基线
    3.与OUTLINE和SQL Profile不同,基线中不存在分类的概念
    4.与OUTLINE和SQL Profile不同,每个SQL语句可以有多个基线。Oracle根据制定的规则来判断具体是否哪个基线
    5.基线针对RAC中所有的实例都生效
    6.基线有两个表示,一个为sql_handle,可以理解为表示语句文本的唯一标识,一个为sql_plan_name可以理解为执行计划的唯一标识
    7.不能像sql profile一样通过force_matching属性将字面值不一样的SQL语句使用一个基线应用多个语句。

创建基线的几种方式
    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语句解析的用户名等等方式,具体见文档

基线的几种状态
    一个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‘));

演化基线
    为了验证基线中一个处于不可接受状态的执行计划是否比一个处于可接受状态的执行计划具有更高的效率,
    必须通过演化来验证,需要让优化器以不同的执行计划来执行这条SQL语句,观察不可接受状态的执行计划基线是否会带来更好的性能,
    如果性能确实更高,这个不可接受状态的基线将会转换为可接受状态。演化的方式有两种:
    1、手工执行运行
    SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => ‘SYS_SQL_xxxxxxxxxxxxx‘) From dual;
    还有time_limit/verify/commit几个参数,可以参考文档
    2、调优包实现基线的自动演化,可以理解为,启动一个调度任务,周期性的检查是否有不可接受状态的基线可以被演化    

修改基线
    可以通过dbms_spm.alter_sql_plan_baseline包来修改基线的一些属性,主要有如下几个属性
    1.ENABLED :设置该属性的值为NO告诉Oracle 11g临时禁用某个计划,一个SQL计划必须同时标记为ENABLED和ACCEPTED,否则CBO将忽略它
    2.FIXED:设置为YES,那个计划将是优化器唯一的选择[最高优先级],即使如果某个计划可能拥有更低的成本。
        这让DBA可以撤销SMB的默认行为,对于转换一个存储概要进入一稳定的SQL计划基线特别有用,注意当一个新计划被添加到被标记为FIXED的SQL计划基线,该新计划不能被利用除非它申明为FIXED状态
    3.AUTOPURG:设置这个属性的值为NO告诉Oracle 11g无限期保留它,从而不用担心SMB的自动清除机制
    4.plan_name : 改变SQL plan 名字
    5.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;
    /
时间: 2024-11-06 09:35:59

15 sql base line 工作机制的相关文章

apache工作机制,压缩,虚拟主机,用户认证

从服务器角度一次web资源请求具体过程 建立连接:tcp三次握手 接收请求 处理请求 访问资源 构建响应报文 发送响应 记录日志 =================================================================== httpd工作模型 阻塞模型,单进程模型.缺点:每次只能响应一个请求,对于现代的高并发无满足 只有一个进程,每次只能响应一个用户的请求 . 多进程模型,缺点:不停的创建和收回进程,进程间切换也耗费时间. httpd监听在套接字上,每当

深入分析 Java I/O 的工作机制

I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 瓶颈.本文的目的正是分析 I/O 的内在工作机制,你将了解到:Java 的 I/O 类库的基本架构:磁盘 I/O 工作机制:网络 I/O 的工作机制:其中以网络 I/O 为重点介绍 Java Socket 的工作方式:你还将了解到 NIO 的工作方式,还有同步和异步以及阻塞与非阻塞的区别,最

深入分析 Java I/O 的工作机制(转载)

声明:本文转自 http://www.ibm.com/developerworks/cn/java/j-lo-javaio/ I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 瓶颈.本文的目的正是分析 I/O 的内在工作机制,你将了解到:Java 的 I/O 类库的基本架构:磁盘 I/O 工作机制:网络 I/O 的工作机制:其中以网络 I/

浏览器是怎样工作的 浏览器从头到尾的工作机制

浏览器是怎样工作的 浏览器从头到尾的工作机制 来源:互联网 作者:佚名 时间:12-12 14:44:10 [大 中 小] 前两天看到一篇不错的英文文章,叫做 How browsers work,该文概要的介绍了浏览器从头到尾的工作机制,包括HTML等的解析,DOM树的生成,节点与CSS的渲染等等,对于想学习浏览器源码的同学来说,实在是很棒的一篇科普文章,于是,我想分节挑重点翻译一下与大家分享 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工 作原理,我们将看到,从你在地址栏输入goog

MySQL Proxy和 Amoeba 工作机制浅析

MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的.代理服务器是和TCP/IP协议打交道,而要理解MySQL Proxy的工作机制,同样要清楚MySQL客户端和服务器之间的通信协议,MySQL Protocol 包括认证和查询两个基本过程: 认证过程包括: 客户端向服务器发起连接请求 服务器向客户端发送握手信息 客户端向服务器发送认证请求 服务器向客户端发送认证结

hibernate学习系列-----(2)hibernate核心接口和工作机制

在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: Configuration类 SessionFactory接口 Session接口 Transaction接口 Query和Criteria接口 下面就进行分类别地详细说明: Configuration类 功能描述:Configuration类负责管理Hibernate的配置信息作并根据配置信息启动H

SQL Server DBA工作内容详解

原文:SQL Server DBA工作内容详解 在Microsoft SQL Server 2008系统中,数据库管理员(Database Administration,简称为DBA)是最重要的角色.DBA的工作目标就是确保Microsoft SQL Server 2008系统正常高效地运行.DBA的工作也是最繁忙的工作,无论是性能调整,还是灾难恢复,都离不开DBA的支持. 一般地,作为一个DBA,至少应该做好以下12项任务: 任务一:安装和配置; 任务二:容量规划; 任务三:应用架构设计; 任

实现php-fpm的工作机制,编译LAMP_2015092101

本次实验目的:实现httpd与php通过fpm结合. 服务器相关信息: IP:172.16.113.16 2.6.32-504.el6.x86_64 [[email protected]~]# cat redhat-re [[email protected]~]# cat /etc/redhat-release  CentOSrelease 6.6 (Final) 编译安装httpd2.2 需要的源码包: httpd-2.4.16.tar.bz2 apr-1.5.0.tar.bz2 apr-ut

深入分析 Java I/O 的工作机制--转载

Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性能瓶颈.正因如此,所以 Java 在 I/O 上也一直在做持续的优化,如从 1.4 开始引入了 NIO,提升了 I/O 的性能.关于 NIO 我们将在后面详细介绍. Java 的 I/O 操作类在包 java.io 下,大概有将近 80 个类,但是这些类大概可以