Oracle 11g 执行计划管理2

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> 
时间: 2024-07-31 14:32:30

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

Oracle 11g 执行计划管理1

1. 执行计划管理的工作原理 1.1控制执行计划的稳定性 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而导致的性能下降. 11g开始,oracle引入了SQL执行计划管理,从而可以让系统自动的来控制SQL语句执行计划的稳定性,进而防止由于执行计划发生变化而导致的性能下降 1.2 11g执行计划管理 优化器会为所有执行次数超过一次的SQL语句维护该SQL语句的每个执行计划的历史列表(plan histo

Oracle 11g 执行计划管理概述

以下内容来源于:http://www.51cto.com/art/200806/76223.htm 35.2  执行计划管理 35.2.1  概述 同一SQL语句的执行计划可能因为优化器的版本.优化统计.优化参数.系统设置的不同而不同.而SQL语句的执行计划自动改变,通常情况下会带来性能提升,但是在某些情况下可能导致系统性能的下降.在11g之前,DBA使用存储大纲(Stored Outline)和SQL 概要(Profile)来固定某些SQL语句的执行计划,防止因为系统自动更改执行计划而导致的性

oracle SPM 执行计划管理

************************************************************ 第一部分:概念 ************************************************************ SQL 计划管理是一种随Oracle Database 11g 引入的新功能,通过维护所谓的"SQL 计划基线(SQL plan baseline(11g))"来使系统能够自动控制SQL 计划演变.启用此功能后, 只要证明新生成的

Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31

Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31 本课程介绍: Oracle视频教程,风哥本套oracle教程培训<<Oracle数据库性能优化培训教程>>的第1/10套:Oracle性能优化之执行计划管理.主要学习Oracle性能优化简介,SQL 语句处理流程,软解析和硬解析,绑定变量及案例,游标的介绍,Oracle的优化器,执行计划的查看,SQL语句访问路径,SQL语句的连接方式,Oracle驱动表,执行计划的干预,常用hint提示的使用. 视频教

[转]Oracle DB SQL 计划管理

? 设置SQL 计划管理 ? 设置各种SQL 计划管理方案 SQL 计划管理:概览 ? SQL 计划管理是自动控制的SQL 计划演变. ? 优化程序可自动管理SQL 计划基线. – 仅使用已知的和经过验证的计划. ? 将自动对计划更改进行验证. – 仅继续使用可比较的或较好的计划. ? 可通过SQL 性能分析器在SQL 优化集(STS)  中预先植入重要的SQL SQL 计划管理:概览 SQL 语句的SQL 执行计划发生更改时,可能存在性能风险. SQL 计划发生更改的原因有很多,如优化程序版本

oracle稳定执行计划1

稳定执行计划 1 策略: Oracle的sql 执行计划在一些场景下会发生变化,导致系统会发生不可知的情况,影响系统的稳定性,特别是关键业务的sql. 比如下面的场景: 统计信息过老,重新收集了统计信息. 为表添加了新的分区,删除分区. 而oracle提供的稳定执行计划的策略也大致有: 存储纲要(stored outlines) Sql 基线(sql baseline 11g) Sql profile Hint 在这几种方式中,在应用端任何的sql变动都会使stored outlines, sq

Oracle SQL执行计划基线总结(SQL Plan Baseline)

一.基础概念 Oracle 11g开始,提供了一种新的固定执行计划的方法,即SQL plan baseline,中文名SQL执行计划基线(简称基线),可以认为是OUTLINE(大纲)或者SQL PROFILE的改进版本,基本上它的主要作用可以归纳为如下两个: 1.稳定给定SQL语句的执行计划,防止执行环境或对象统计信息等等因子的改变对SQL语句的执行计划产生影响! 2.减少数据库中出现SQL语句性能退化的概率,理论上不允许一条语句切换到一个比已经执行过的执行计划慢很多的新的执行计划上! 注意:

[转]Oracle DB 执行用户管理的备份和恢复

• 说明用户管理的备份和恢复与服务器管理的备份和恢复之间的差异 • 执行用户管理的数据库完全恢复 • 执行用户管理的数据库不完全恢复 备份和恢复的使用类型 数据库备份和恢复的类型包括: • 用户管理的:不使用RMAN – 使用OS 命令移动文件 – DBA 需要手动维护备份活动记录 • 服务器管理的:使用RMAN 有两种方法可用来恢复数据库.可以使用RMAN 并利用其自动恢复功能.它可以还原相应的文件,并使用非常少的命令使数据库恢复到当前状态.还可以手动进行恢复.这称为“用户管理的恢复”.用户管

使用hint优化Oracle的执行计划

背景: 某表忽然出现查询非常缓慢的情况,cost 100+ 秒以上:严重影响生产. 原SQL: explain plan for select * from ( select ID id,RET_NO retNo, FROM_SYS fromSy, TO_SYS toSys, COMMAND_CODE commandCode, COMMAND, STATUS, EXT_CODE, ORIGN_CODE orignCode,error_message errorMessage, RE_F, RET