1.创建测试数据

SQL> conn NC50/NC50
Connected.
SQL> create table tab1(id number,object_name varchar2(100));
SQL> insert into tab1 select rownum,object_name from dba_objects;
SQL> commit;
SQL> set line 180
SQL> select * from tab1 where id=200;
SQL> select * from tab1 where id=200;

  尽管执行两次,但是这时去查询dba_sql_plan_baselines,试图找到SQL文本为select * from tab1 where id=200;的记录时,会发现没有记录,因为optimizer_capture_sql_plan_baselines缺省为false。我们将该参数设置为true以后继续测试

SQL> show parameter optimizer_capture_sql_plan_baselines

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
optimizer_capture_sql_plan_baselines boolean FALSE
SQL> select * from dba_sql_plan_baselines where SQL_TEXT like '%tab1%';
no rows selected
SQL>

2.开启自动捕获

SQL> alter session set optimizer_capture_sql_plan_baselines=true;
SQL> set line 180
SQL> set autotrace off
SQL> select * from tab1 where id=200; ID OBJECT_NAME
---------- ----------------------------------------------------------------------------------------------------
200 SYS_LOB0000000207C00007$$ --查看对应的执行计划
SQL> select signature,sql_handle,plan_name,origin,enabled,accepted,fixed,autopurge
2 from dba_sql_plan_baselines
3 where sql_text like 'select * from tab1 where id=200'; SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC FIX AUT
---------- ------------------------------ ------------------------------ -------------- --- --- --- ---
8.3850E+18 SYS_SQL_745da4c2e5a4b97a SQL_PLAN_78rd4sbku9fbuec7b7588 AUTO-CAPTURE YES YES NO YES SQL>
可以看到,SQL语句在plan history里产生了一个执行计划。其中:
sql_handle表示SQL语句的句柄;
plan_name则表示该SQL的执行计划的名字;
origin表示该执行计划是如何进入plan history的,该列值为AUTO-CAPTURE则说明是由优化器自动加入的,如果为MANUAL则说明是由DBA手工加入的;
Enabled (控制活动):
+ YES (活动的,但不一定会被使用)
+ NO (可以理解为被标记删除)
Accepted(控制使用):
+ YES (只有 “Enabled” 并且“Accepted” 的计划才会被选择使用)
+ NO (如果是“Enabled” 那么只有被evolve成“Accepted”才有可能被执行)
Fixed(控制优先级):
+ YES (如果是“Enabled”并且“Accepted”,会优先选择这个计划,这个计划会被视为不需要改变的)
+ NO (普通的计划,无需优先)
autopurge表示该执行计划是否为定期自动删除,YES表示是,NO表示否。

  继续测试,在id上添加一个索引,从而让原来的SQL不走全表扫描,而改走索引扫描

SQL> create index idx_tab1 on tab1(id);
SQL> exec dbms_stats.gather_table_stats('NC50','tab1',cascade=>true);
SQL> select * from tab1 where id=200; ID OBJECT_NAME
---------- ----------------------------------------------------------------------------------------------------
200 SYS_LOB0000000207C00007$$ SQL> select signature,sql_handle,plan_name,origin,enabled,accepted,fixed,autopurge
2 from dba_sql_plan_baselines
3 where sql_text like 'select * from tab1 where id=200'; SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC FIX AUT
---------- ------------------------------ ------------------------------ -------------- --- --- --- ---
8.3850E+18 SYS_SQL_745da4c2e5a4b97a SQL_PLAN_78rd4sbku9fbu61724234 AUTO-CAPTURE YES NO NO YES
8.3850E+18 SYS_SQL_745da4c2e5a4b97a SQL_PLAN_78rd4sbku9fbuec7b7588 AUTO-CAPTURE YES YES NO YES

  这时我们可以看到,dba_sql_plan_baselines视图里多了一个执行计划,也就是我们后面那个使用了索引扫描的执行计划。而该执行计划的accepted为NO,说明该计划并没有进入plan baseline里,但是进入了plan history里。因为新生成的为不是ACCEPTED,所以不被启用。验证如下:

SQL> set autotrace traceonly explain
SQL> select * from tab1 where id=200; Execution Plan
----------------------------------------------------------
Plan hash value: 2211052296 --------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 112 (1)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| TAB1 | 1 | 28 | 112 (1)| 00:00:02 |
-------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("ID"=200) Note
-----
- SQL plan baseline "SQL_PLAN_78rd4sbku9fbuec7b7588" used for this statement SQL>

  启用的执行计划不是高效的(SQL_PLAN_78rd4sbku9fbu61724234),而是全表扫描的(SQL_PLAN_78rd4sbku9fbuec7b7588)。启用高效的执行计划之前,需要
手动将执行计划演化成ACCEPTED

3.现将新生成的执行计划演化成ACCEPTED

SQL> set autotrace off
SQL> SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => 'SYS_SQL_745da4c2e5a4b97a') FROM dual;
SQL> select signature,sql_handle,plan_name,origin,enabled,accepted,fixed,autopurge
2 from dba_sql_plan_baselines
3 where sql_text like 'select * from tab1 where id=200'; SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC FIX AUT
---------- ------------------------------ ------------------------------ -------------- --- --- --- ---
8.3850E+18 SYS_SQL_745da4c2e5a4b97a SQL_PLAN_78rd4sbku9fbu61724234 AUTO-CAPTURE YES YES NO YES
8.3850E+18 SYS_SQL_745da4c2e5a4b97a SQL_PLAN_78rd4sbku9fbuec7b7588 AUTO-CAPTURE YES YES NO YES SQL> --查看 当前所走的执行计划
SQL> set autotrace traceonly explain
SQL> select * from tab1 where id=200;
Execution Plan
----------------------------------------------------------
Plan hash value: 2722636538 ----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TAB1 | 1 | 28 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TAB1 | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("ID"=200) Note
-----
- SQL plan baseline "SQL_PLAN_78rd4sbku9fbu61724234" used for this statement SQL>

  结论:存在多个( “Enabled”“Accepted”)的计划时,选择cost最小的

4.删除Plans 和 Baselines

DECLARE
l_plans_dropped PLS_INTEGER;
BEGIN
l_plans_dropped := DBMS_SPM.drop_sql_plan_baseline (
sql_handle => 'SYS_SQL_745da4c2e5a4b97a',
plan_name => 'SQL_PLAN_78rd4sbku9fbu61724234'); DBMS_OUTPUT.put_line(l_plans_dropped);
END; SQL> set autotrace off
SQL> select signature,sql_handle,plan_name,origin,enabled,accepted,fixed,autopurge
2 from dba_sql_plan_baselines
3 where sql_text like 'select * from tab1 where id=200'; SIGNATURE SQL_HANDLE PLAN_NAME ORIGIN ENA ACC FIX AUT
---------- ------------------------------ ------------------------------ -------------- --- --- --- ---
8.3850E+18 SYS_SQL_745da4c2e5a4b97a SQL_PLAN_78rd4sbku9fbuec7b7588 AUTO-CAPTURE YES YES NO YES SQL>

Oracle 11g 执行计划管理2的更多相关文章

  1. Oracle 11g 执行计划管理1

    1. 执行计划管理的工作原理 1.1控制执行计划的稳定性 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而 ...

  2. (转)Oracle定时执行计划任务

    Oracle定时执行计划任务 在日常工作中,往往有些事情是需要经常重复地做的,例如每天更新业务报表.每天从数据库中提取符合条件的数据.每天将客户关系管理系统中的数据分配给员工做数据库营销……因此我们就 ...

  3. OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  4. 怎样看懂Oracle的执行计划

    怎样看懂Oracle的执行计划 一.什么是执行计划 An explain plan is a representation of the access path that is taken when ...

  5. 【ORACLE】记录通过执行Oracle的执行计划查询SQL脚本中的效率问题

    记录通过执行Oracle的执行计划查询SQL脚本中的效率问题   问题现象: STARiBOSS5.8.1R2版本中,河北对帐JOB执行时,无法生成发票对帐文件.   首先,Quartz表达式培植的启 ...

  6. Oracle的执行计划(来自百度文库)

    如何开启oracle执行计划 http://wenku.baidu.com/view/7d1ff6bc960590c69ec37636.html怎样看懂Oracle的执行计划 http://wenku ...

  7. Oracle sql执行计划解析

    Oracle sql执行计划解析 https://blog.csdn.net/xybelieve1990/article/details/50562963 Oracle优化器 Oracle的优化器共有 ...

  8. Oracle DB 执行用户管理的备份和恢复

    • 说明用户管理的备份和恢复与服务器管理的备份和恢复 之间的差异 • 执行用户管理的数据库完全恢复 • 执行用户管理的数据库不完全恢复 备份和恢复的使用类型 数据库备份和恢复的类型包括: • 用户管理 ...

  9. oracle稳定执行计划1

    稳定执行计划 1 策略: Oracle的sql 执行计划在一些场景下会发生变化,导致系统会发生不可知的情况,影响系统的稳定性,特别是关键业务的sql. 比如下面的场景: 统计信息过老,重新收集了统计信 ...

随机推荐

  1. Scala模式匹配语言,java的替代者

    1.建立的JVM之上 2.强大的集合工具类,增强模式匹配 3.函数式编程模型(链式编程模式) 4.线程池与消息机制的增强 5.面向对象,运行在jvm之上

  2. JavaScript自己模仿jQuery的一点小代码

    function seter(sId) {    var obj = document.getElementById(sId);    return new function () {        ...

  3. Spring配置事务 http://www.cnblogs.com/leiOOlei/p/3725911.html

    http://www.cnblogs.com/leiOOlei/p/3725911.html JNDI方式配置数据源: <?xml version="1.0" encodin ...

  4. A手机等的网络udp广播,收到广播以后回复udp消息

    B手机:向A手机发送一条消息,等待A回复 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: ...

  5. DP最长递增字符串

    对于最简单DP问题,比如7 9 1 10 3中最长的递增字符串就是7 9 10,所以长度是3. 对于这个问题,就是从第二个开始,让后面的每一个字符都假设作为咱们要找的最长的字符串的最后一个字符,然后从 ...

  6. flex的Cairngorm框架

    由于要写flex的项目,接触了一段时间的Cairngorm框架,初步认识它是flex的一个mvc结构的框架实现了页面,调用相应方法的控制,和后台交互之间的三层之间的联系.Cairngorm框架主要包括 ...

  7. socket学习笔记——select与epoll函数的使用(linux)

    select.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <u ...

  8. org.springframework.core.NestedIOException

    今天遇到的一个小异常,报错信息如下: 2013-11-13 10:00:32 org.apache.catalina.core.StandardContext listenerStart严重: Exc ...

  9. VS2010插件及快捷键设置

    几个常用的Visual Studio插件,番茄助手以及如下的插件,具体作用可用通过Google自行获取. 安装番茄助手后,可用在源文件和头文件中快速切换.但为了更方便使用,建议设置快捷键. vs201 ...

  10. 【MySQL】MySQL无基础学习和入门之一:数据库基础概述和实验环境搭建

    数据库基础概述  大部分互联网公司都选择MySQL作为业务数据存储数据库,除了MySQL目前还有很多公司使用Oracle(甲骨文).SQLserver(微软).MongoDB等. 从使用成本来区分可以 ...