oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)

1.   简介

Oracle Database11gR1引进了SQL PlanManagement(简称SPM),一套允许DBA捕获和保持任意SQL语句执行计划最优的新工具,这样,限制了刷新优化器统计数据,已有应用改变,甚至数据库版本升级带来的影响。本文帮助对SPM原理基本了解,并对其性能优化能力进行简要的说明。

2.   SPM原理和机制

Oracle 11g通过一个简单而优雅的方法实施了解决SQL计划意外恶化的一套称为SQL Plan Management(SPM)的新特点。只要用户会话开启了自动SQL Plan Baseline捕获,CBO就会在SQL Management Base(SMB)内记录该会话内执行的任何SQL,把SQL语句文本,梗概(Outline),绑定变量,及其编译环境等存储为一个SQL Plan Baseline。

由于这是语句第一次执行,Oracle11g会把当时的执行计划当成最优的。正是在相同SQL语句第二次执行时,SPM的优雅才体现的更加明显。在语句的第二次执行期间,CBO会比较语句的执行计划和存储在SMB中的计划,新计划被评估看它是否比SMB中的计划更高效。

如果新计划会改善语句的性能,那么,SPM会把新计划标记为该语句最好的计划。只要DBA没修改OPTIMIZER_USE_SQL_PLAN_BASELINES参数的默认设置(true),那么,CBO就会在当前的语句执行中采用新的计划。否则,如果新计划降低了语句的性能,那么,CBO会从SMB中所有可接受计划中选择一个成本最低的计划,并且,SPM会把那个新计划存储到SMB中,因为在不久的未来,该新计划也许成为不错的选择。

2.1.  捕获SQL Plan Basebline

Oracle11g中,捕获SQLPlan Baseline并存储到SMB中是非常容易的事情。首先,OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES参数控制SQL Plan Baselines自动捕获是否开启,该参数的默认设置为FALSE,这意味着SQL Plan Baselines默认不会被自动捕获。然而,DBA在会话或系统级将它设置为TRUE,SPM就开始记录SQL语句的执行,当一条SQL语句被执行多于一次时,该SQL语句就被认为SQL Plan Baselines捕获的候选。 

其次,Oracle11g有个新的包DBMS_SPM,通过从以下几个来源手工“种植”计划,可以预先捕获和引进大量SQL语句:

Ø 数据库Library Cache中一个或多个SQL语句能被用来创建SQL PlanBaselines。过程LOAD_PLANS_FROM_CURSOR_CACHE能被用来在Library Cache中捕获任何语句的子集作为潜在SMB的候选。 

Ø 存储于SQL Tuning Set或一个AWR快照中的SQL语句能被过程LOAD_PLANS_FROM_SQLSET捕获和被转换进SQL Plan Baselines。

Ø 最后,SQL Plan Baselines能来自一个导入存储表。这意味着可以从不同的数据库捕获语句。

3.  查看SQL Plan Baseline信息

被捕获和存储在SMB中的SQL Plan Baseline元数据包含SPM和CBO用来控制计划的属性。当新计划进入SMB时,它被标为ENABLED,但还不能标记ACCEPTED,直到:

1)   CBO已经评估了该计划并判断它为最好的计划;

2)   计划已被演化为ACCEPTED模式。在CBO考虑采用一个计划前,该计划必须被标记为ENABLED和ACCEPTED。

查看这些元数据最简单的方法就是查询DBA_SQL_PLAN_BASELINES字典视图。下面是一个控制执行计划的最有价值信息的总结: 

Table 1.1. SQL Plan Baseline Plan Control Metadata

Attribute

Description

SQL_HANDLE

A unique SQL identifier in string form; it can be used as a search key

PLAN_NAME

A unique SQL plan identifier in string form; it can be used as a search key

SQL_TEXT

The SQL statement’s unnormalized, actual text

ORIGIN

Tells if the SQL Plan was either:

  • AUTO-CAPTURE: Automatically captured
  • MANUAL-LOAD: Manually evolved
  • MANUAL-SQLTUNE: Automatically evolved by SQL Tuning Advisor
  • AUTO-SQLTUNE: Automatically evolved by Automatic SQL Tuning

ENABLED

Indicates that the SQL Plan is enabled (YES) for CBO utilization or not (NO). Disabled plans are ignored by the CBO

ACCEPTED

Indicates that the SQL Plan is validated as a good plan, either because Oracle 11g has:

  • Automatically accepted it, or
  • The DBA has forced its manual acceptance by changing its status to ACCEPTED via procedure DBMS_SPM.ALTER_SQL_PLAN_BASELINE()

FIXED

SQL Plans whose FIXED attribute is set to YES will be considered by the CBO. If multiple plans are marked as FIXED, the CBO will only select the best execution plan from those so marked

OPTIMIZER_COST

The total cost estimated by the CBO to execute the SQL statement using this execution plan

查看已存在SQL Plan Baselines中,对一条SQL语句执行有潜在影响的另一个方法是通过DBMS_XPLAN的新过程DISPLAY_SQL_PLAN_BASELINE。例如:能用这个过程来查看SMB中和SQL语句柄匹配的所有SQLPlan Baselines;如果提供了SQL语句的计划名,也可以显示该语句的执行计划等。

4.   自动捕获的实现和过程

下面,我们分析自动捕获SQL Plan Baselines的过程。首先,我们设置OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES参数为TRUE(默认为FALSE)以开启SQL Plan Baselines自动捕获;我们还需要把OPTIMIZER_USE_SQL_PLAN_BASELINES参数设置为TRUE (默认值)。该参数控制CBO是否检查SQL语句重复执行产生的计划是否将被评估为一个好的计划。

接着,我们执行同样的一个SQL两次。第一次执行时,SQL语句被记录,第二次执行时,计划自动被捕获进SMB并被标记为该语句ACCEPTED的SQLPlan Baseline。

当今后该SQL语句再次被执行,并产生了一个不同的新的计划时,该计划也会被自动捕获进SMB,但并不被标为ACCEPTED,所以,SPM只会把第一个计划标记为ENABLED和ACCEPTED。

5.  SQL Plan Baseline的演化

SPB中未被标示为ACCEPTED的SQL Plan Baselines,需要进一步被演化为标示ACCEPTED状态,才可以被今后再次执行的SQL语句采用,对SPB进行演化的方法,主要有如下两种:

5.1.  手工方法

Ø 调用dbms_spm包的evolve_sql_plan_baseline()函数

SQL> var report clob;

SQL> exec :report := dbms_spm.evolve_sql_plan_baseline();

SQL> print :report

SQL> select sql_text, plan_name, enabled, accepted fromdba_sql_plan_baselines;

Ø 调用SQL Tuning Advisor工具包

SQL> var tname varchar2(30);

SQL> exec :tname :=dbms_sqltune.create_tuning_task(sql_id => 'bfbr3zrg9d5cc');

SQL> execdbms_sqltune.execute_tuning_task(task_name => :tname);

SQL> selectdbms_sqltune.report_tuning_task(:tname, 'TEXT', 'BASIC') FROM dual;

SQL> exec dbms_sqltune.accept_sql_profile(task_name=> :tname);

SQL> select sql_text, plan_name, enabled,accepted from dba_sql_plan_baselines;

5.2.  自动方法

Ø  定期调度dbms_spm包的evolve_sql_plan_baseline()

Ø  配置SQL TUNING ADVISOR,使其在自动任务窗口自动运行

6.   具体操作命令

Ø  开启自动捕获和采用SPM

ALTER SESSION SET optimizer_capture_sql_plan_baselines=TRUE;

ALTER SESSION SET optimizer_use_sql_plan_baselines=TRUE;

Ø  查看SPM元数据

COL creator         FORMAT A08      HEADING 'Creator'
COL hndle           FORMAT A08      HEADING 'SQL|Handle'
COL plnme           FORMAT A08      HEADING 'Plan|Name'
COL sql_hdr         FORMAT A25      HEADING 'SQL Text' WRAP
COL origin          FORMAT A12      HEADING 'Origin'
COL optimizer_cost  FORMAT 9999999  HEADING 'CBO|Cost'
COL enabled         FORMAT A04      HEADING 'Ena-|bled'
COL accepted        FORMAT A04      HEADING 'Acpt'
COL fixed           FORMAT A04      HEADING 'Fixd'
COL autopurge       FORMAT A04      HEADING 'Auto|Purg'
COL create_dt       FORMAT A11      HEADING 'Created|On' WRAP
COL lst_exc_dt      FORMAT A11      HEADING 'Last|Executed' WRAP
SELECT 
     creator
    ,SUBSTR(sql_handle, -8, 8) hndle
    ,SUBSTR(plan_name, -8, 8)  plnme
    ,SUBSTR(sql_text, 1, 75) sql_hdr
    ,origin
    ,optimizer_cost
    ,enabled
    ,accepted
    ,fixed
    ,autopurge
    ,TO_CHAR(created, 'yyyy-mm-dd hh24:mi:ss') create_dt
    ,TO_CHAR(last_executed, 'yyyy-mm-dd hh24:mi:ss') lst_exc_dt
  FROM dba_sql_plan_baselines
  WHERE (sql_text LIKE '%SPM%')
 ORDER BY 1,2,3;

Ø  通过DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE显示已保留的包含特定文本的SQL Plan Baselines

SET LINESIZE 150
SET PAGESIZE 2000
SELECT PT.*
   FROM (SELECT 
             DISTINCT sql_handle 
           FROM dba_sql_plan_baselines
          WHERE sql_text like '%SPM%') SPB,
        TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(SPB.sql_handle, NULL,'TYPICAL +NOTE')) PT;

转载于:https://www.cnblogs.com/lhdz_bj/p/8874496.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基本命令+Makefile

1.linux下查看进程占用cpu的情况(top); 格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 主要参数 d:指定更新的间隔,以秒计算。q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先…

数据结构与算法--2.数组的定位排序

问题: 给定一个数组A以及下标i,将数组元素进行调整,使得所有比A[i]小的元素排在前边,接着是所有等于A[i]的元素,最后排列的是比A[i]大的元素 思路: 第一步:将数组分成两部分,一部…

mysql语法题_mysql数据库题语法练习

一、练习。导入下面sql执行语句/*数据导入:Navicat Premium Data TransferSource Server : localhostSource Server Type : MySQLSource Server Version : 50624Source Host : localhostSource Database : sqlexamTarget Server Type : MySQLTarget Server Version …

ipv4的不足

v地址基本耗尽,这是当前最棘手的问题v路由表越来越大v功能不足,缺少对多媒体信息传输的支持v缺少对高速传输的支持v缺少对安全的支持v缺少对主机漫游的支持

OpenGL开发库的详细介绍

OpenGL开发库的组成 开发基于OpenGL的应用程序&#xff0c;必须先了解OpenGL的库函数。它采用C语言风格&#xff0c;提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律。所有OpenGL函数采用了以下格式<库前缀><根命令><可选的参数个数&g…

thinkphp5运行原理_ThinkPHP5.1~5.2全版本远程代码执行高危漏洞预警

漏洞综述关于ThinkPHPThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架&#xff0c;其借鉴了国外很多优秀的框架和模式&#xff0c;包括使用面向对象的开发结构和MVC模式&#xff0c;融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式等。该框架常…

ASP.NET MVC中controller和view相互传值的方式

ASP.NET MVC中Controller向view传值的方式&#xff1a; ViewBag、ViewData、TempData单个值的传递Json匿名类型ExpandoObjectCookieViewModel(向普通View页面传个Model对象、向强类型页面传一个Model对象、用一个ViewModel对象解决所有问题)ASP.NET MVC中view向Controller传值的…

自定义SeekBar 实时显示百分比进度

进度下方实时显示百分比进度禁止掉了SeekBar的滑动事件 详情 githus地址

数据结构与算法--3.字符串的旋转

题目&#xff1a; A是含有n个元素的数组&#xff0c;如果可以申请到最大内存&#xff0c;那么把A从位置i开始旋转是比较简单的。例如&#xff1a;A:a,b,c,d,e.其中i3,旋转后的字符串A为&#xff1a;d,e,a,b,c要求设计一个时间复杂度为O(n),空间复杂度为O(1)的算法&#xff0c;…

三网融合情况下,实时语音通信技术解决之道

随着技术和标准的不断成熟,伴随着“三网合一”的大潮,VoIP可望成为下一代电信基础设施结构的杨心,使未来各电信业务综合统一在IP网络上成为可能,导致数据的融合和未来电信市场的重组,并带来新的经济模式和价值链。 Internet在全世界范围内的快速发展和语音信号处理技术的进步,促…

ipv6相对于ipv4的改进

v更大的地址空间&#xff1a;16字节&#xff0c;128位v首部的简化&#xff1a;只有7个固定域&#xff0c;撤消了有关分段的域和校验和域&#xff0c;以便更快地处理分组&#xff0c;提高路由器的吞吐量缩短延时。v更好地支持选项&#xff1a;选项是有次序的&#xff0c;以便路由…

轻量高效的开源JavaScript插件和库 【转】

图片布局轮播图弹出层音频视频编辑器字符串表单存储动画时间其它加载器构建工具测试包管理器CDN图片 baguetteBox.js - 是一个简单易用的响应式图像灯箱效果脚本。demoLightgallery.js - 是一个功能齐全的JavaScript图像灯箱插件。demoviewerjs - 是一个图像预览插件。democrop…

Linux内核中的常用宏container_of其实很简单【转】

转自&#xff1a;http://blog.csdn.net/npy_lp/article/details/7010752 开发平台&#xff1a;Ubuntu11.04 编 译器&#xff1a;gcc version 4.5.2 (Ubuntu/Linaro4.5.2-8ubuntu4) Container_of在Linux内核中是一个常用的宏&#xff0c;用于从包含在某个结构中的指针获得结构本…

mysql concat例子_MYSQL中CONCAT详解

concat()函数1. 功能&#xff1a;返回结果为连接参数产生的字符串。如有任何一个参数为NULL &#xff0c;则返回值为 NULL。2. 语法concat(str1, str2,...)3. 例子案例一&#xff1a;mysql> select concat(苹果,香蕉,梨子);------------------------------| CONCAT(苹果,香蕉…

常见的状态响应码

200&#xff1a;请求正常&#xff0c;服务器正常的返回数据 301&#xff1a;永久重定向。比如在访问www.jingdong.com的时候&#xff0c;会重定向到www.jd.com。 302&#xff1a;临时重定向。比如在访问一个需要登录的界面时&#xff0c;而此时没有登录&#xff0c;那么就会重定…

软件行业为什么那么多项目经理

记得听谁说过&#xff0c;软件行业的项目经理太滥了&#xff0c;二十几岁的毛头小伙子&#xff0c;动不动就是项目经理&#xff0c;手下没几个人&#xff0c;管的也没几个事&#xff0c;在其他行业&#xff0c;项目经理一般都是四五十岁的老头子做&#xff0c;要联系这&#xf…

ipv6的表示方法

v冒分十六进制表示法X:X:X:X:X:X:X:X 其中X表示地址中16位二进制数的十六进制值 例&#xff1a;FEDC:BA98:7654:3210:FEDC:BA98:7654:3210 v零压缩法如其中有多个连续的零&#xff0c;则可用零压缩法 如 &#xff1a;1080:0000:0000:0000:0008:0800:200C:417A 可写成&am…

mysql php7安装配置_centos7无网络下安装部署php7.1.33+mysql5.7.28+apache2.4.6-Go语言中文社区...

centos7无网络下安装部署php7.1.33mysql5.7.28apache2.4.6一、1、先ping www.baidu.com&#xff0c;root账户下&#xff0c;如果未联网&#xff0c;创建目录&#xff0c;把提前下载好的rpm包拷贝到rpm目录下如图&#xff1a;(如果没有安装包请查看我的另一篇教程下载这些安装包…

webkit渲染

2019独角兽企业重金招聘Python工程师标准>>> 参考链接 理解WebKit和Chromium 简明魔法学院 Chrome软件渲染 WebKit渲染基础 Webkit 渲染基础 Webkit不是浏览器,它是一个渲染引擎 软件渲染 硬件渲染(GPU加速) 会触发GPU加速的属性 CSS3 3D transformation, trans…

element ui中dialog相关问题

一&#xff0c;今天需要在dialog里面引入另一个页面&#xff0c;就是打开dialog显示该页面&#xff08;把页面放到dialog中&#xff09;&#xff0c;引入的语句如下&#xff1a; <iframe src"view?pathrkdj_b" ></iframe> 二&#xff0c;使用table组件时…