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

oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)相关推荐

  1. 12c oracle 修改内存_Oracle12c中性能优化功能增强新特性之重大突破——内存列存储新特性...

    Oracle12c中内存列存储 内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数 ...

  2. SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008

    SQL Server 2008中Analysis Services的新特性 --深入SQL Server 2008 内容简介: 本书涵盖了SQL Server 2008引入的新功能.作者之一Rober ...

  3. 11g新特性-自动sql调优(Automatic SQL Tuning)

    11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...

  4. SQL Server 2019 新特性之 SQL Server大数据群集 介绍(一)

    SQL Server 2019 新特性之 SQL Server大数据群集 介绍(一) 从开始SQL Server 2019 预览,SQL Server 大数据群集允许你部署的 Kubernetes 上 ...

  5. SQL Server 2008 R2 新特性之一

    2008年8月6日,微软发布了SQL Server 2008正式版,时至今日,大部分企业还在使用SQL Server 2000和2005. SQL Server 2008 中还是增加了不少新特性的 , ...

  6. android p preview_细数 Android P 开发者预览版中最不能错过的新特性

    原标题:细数 Android P 开发者预览版中最不能错过的新特性 2018年安卓巴士全球开发者论坛-重庆站 [线下活动]春天到了 跟小编一起去重庆嗨皮吧~ Android P 应用适配新特性1.Pr ...

  7. Keil中使有C99及其新特性

    Keil中使有C99及其新特性 Keil选择C99编译 C99特性介绍 Keil选择C99编译 选择C/C++,勾选C99 C99特性介绍 宏支持可变参数定义,例如 #define NRF_LOG_I ...

  8. 【ORACLE】21版本新特性之SQL宏(SQL MACROS)的分析

    前言 在21c发布后,很多文章中都提到了SQL宏,但看到的人们大多都有个疑问,这个SQL宏看上去和一般的函数没什么区别,为什么还要重点拿出来说? 我们先看看ORACLE官方是怎么说的 https:// ...

  9. SQL Server 2012 安全新特性:包含数据库

    SQL Server 2012 新特性(二)安全新特性:包含数据库 一.启用功能 1.修改服务器(实例)的属性 否则,在修改数据库的属性时会报错: 2.修改服务器(实例)的安全性 否则,连接时报错: ...

最新文章

  1. 观点:云大数据服务一定是终极形态吗?
  2. javaweb学习中的路径问题
  3. DS和[address]
  4. Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法
  5. 对象必须实现 iconvertible。_精雕基础教程:对象的显示颜色
  6. windowsterminal设置初始大小_这是我见过最全面的金蝶操作详解了,从初始化到财务使用全流程...
  7. Oracle八大性能视图之v$transaction
  8. java rdd hashmap_利用Spark Rdd生成Hfile直接导入到Hbase详解
  9. python爬虫属于大数据吗_学Python可以从事大数据和爬虫工程师吗?
  10. [RoarCTF 2019]Easy Calc
  11. samba使用指定端口windows访问linux
  12. Peer to Peer ( P2P ) 综述
  13. Solidity语法规范整理
  14. Android一站式框架整合——Rui使用详细指南(基础篇)
  15. 线性代数:约当标准型学习笔记
  16. 项目经理为什么要做时间管理?
  17. 背景图片自适应大小(平铺)
  18. ISCSI企业共享存储方案
  19. ubuntu中终端内容保存到文本文件的三个方法
  20. 眼睛php是什么手术,眼睛什么情况下要做手术

热门文章

  1. python flv转mp4_ffmpeg将多个flv文件合成为mp4(python版)
  2. python面向对象编程的语言_怎么使用python面向对象编程
  3. 详解停车位检测算法 Vision-Based Parking-Slot Detection: A DCNN-Based Approach and a Large-Scale Benchmark
  4. 1.Introduction and Evaluation
  5. 机器学习笔记(3):线性代数回顾
  6. 使用matplotlib进行简单的数据展示
  7. mysql 导出数据库中的某张数据表_mysql 导出数据库中的某张数据表
  8. HTML简单注册页面
  9. android 判断对象,Android网络判断知识小结
  10. 剑指offer:22-25记录