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;

spm oracle cloud,oracle11g新特点——SQLPlanManagement(SPM)-Oracle相关推荐

  1. Oracle Cloud 配置

    目录 1. Oracle Cloud 配置 1.1. 特别注意 1.2. 问题 1: Oracle Cloud SSH 无法远程登录 1.3. 问题 2: Please login as the us ...

  2. oracle rds 运维服务_从Oracle一条新闻说起,为什么我们需要更好更开放的RDS服务?...

    原标题:从Oracle一条新闻说起,为什么我们需要更好更开放的RDS服务? 从Oracle被起诉说起-- 本月中旬,Oracle董事会因"涉嫌在云业务增长方面误导投资者"而被起诉. ...

  3. spm oracle cloud,Expérience client

    Aucun résultat trouvé Votre recherche n'a donné aucun résultat. Nous vous suggérons d'essayer ce qui ...

  4. oracle 分区表 变大,Oracle11G新特性:分区表分区默认segment大小64k变为8M

    Oracle11G新特性:分区表分区默认segment大小64k变为8M 2017-02-08 在oracle11.2创建分区表,每个分区默认大小为8M,是由_partition_large_exte ...

  5. Oracle Cloud Native Framework推出云原生解决方案

    摘要:Oracle Cloud Native Framework云原生平台提供托管云服务和本地软件,同时在现Oracle云基础架构上跨应用程序配置和分析大量服务.developer relations ...

  6. 甲骨文推出全新Oracle Cloud at Customer

    2019独角兽企业重金招聘Python工程师标准>>> 甲骨文3月25日推出了全新系列产品Oracle Cloud at Customer,协助企业便利地迁移至云端,消除企业在采用云 ...

  7. Oracle ASM 11g新特性

    一.什么是ASM ASM全称为Automated Storage Management,即自动存储管理,它是自Oracle10g这个版本Oracle推出的新功能.这是Oracle提供的一个卷管理器,用 ...

  8. oracle可以在liux上装_【Oracle】手把手教你做之Linux上安装Oracle11g

    手把手教你做之Linux上安装Oracle11g 这是我第一次安装时的过程,及遇到问题的解决办法,在此记录,有不妥之处,多多交流. 因为高稳定性及高定制低系统消耗等原因,我们希望在Linux上安装Or ...

  9. 如何在ORACLE CLOUD中创建和访问容器集群丨内附官方文档链接

    墨墨导读:本文描述如何在Oracle Cloud中创建并访问容器服务.为了简单,所有的操作都是针对root隔离区. 创建允许容器运行的政策官方文档链接 这一步是必须的,否则可以增加容器容器. 官方文档 ...

最新文章

  1. 刚进来的小伙伴说Nginx只能做负载均衡,还是太年轻了
  2. 东华计算机学院常珊,常姗 - 东华大学 - 计算机科学与技术学院
  3. linux用户管理最常用的三个文件说明(不完整版)
  4. python中类中属性和方法的具体定义方法和使用
  5. wifi定位算法 java_记一次APP的so层算法逆向(七)
  6. java 7 Reflection详解(二),获取class对象信息
  7. graphics | 基础绘图系统(九)——栅格图、点密度图、等高线(填充)图、三维图...
  8. Android FrameWork——Activity启动过程详解
  9. 连接SQL SERVER的时候登录名如何清除
  10. java 实现将Object类型转换为int类型
  11. 安卓比较好的数独软件_有没有比较好的数独游戏APP?
  12. 如何区分电梯卡为id卡ic卡_如何分辨IC卡和ID卡
  13. win7定时关机命令_磨刀三分钟 | 以【设置定时关机】为例,学会计算机界的如来神掌第1式...
  14. ios正式包ipa,发布苹果应用商店App Store
  15. wlacm一笔画问题(图的遍历) 题解
  16. 微信小程序和uniapp开发工具
  17. 沈阳服务器主板维修,沈阳铁西区附近电脑主板维修
  18. 岁月蹉跎,人生几何。
  19. bvs是什么意思_股票b和s是什么意思,区别原来这么简单
  20. 中国软件网联手华赛信息为软件企业 提供CMMI咨询及认证服务

热门文章

  1. 对象属性的调用_面向对象的三主线之一:Java类及类的成员(1)
  2. Javaweb-----HTTP协议
  3. Python编程4道练习题
  4. 如何在python中使用正则表达式从多行字符串中删除特定字符
  5. python3中map()函数用法
  6. Python里三个最高逼格的调试神器
  7. 5 加盐_小葱拌豆腐的5种做法,收藏起来慢慢学!
  8. compact php,php中compact函数的功能起什么作用呢?
  9. windows10如何删除文件时提示?(回收站--右键属性--显示删除确认对话框)
  10. Intel Realsense D435 当usb显示为2.x时,是否能正常运行? 2.1 3.2