概要 

Oracle Outline是用来保持SQL运行计划(execution
plan)的一个工具。

我们能够通过outline工具防止SQL运行计划在数据库环境变更(如统计信息,部分參数等)而引起变化。 

Outline的主要使用在下面情况: 

1. 

为避免在升级后某些sql出现严重性能下降并且在短时间内不能优化的情况, 

我们能够使用outline的功能将原生产库中的sql运行计划实施在新的数据库上。 

2. 

为避免SQL的运行计划在统计数据不准确的情况(如未能及时收集表或索引的统计信息)下导致变化从而引起的性能减少。 

3. 

避免大规模分布实施的应用出现数据库版本号、配置等差别引起的优化器产生不同的运行计划。 

4. 

某些Bug引起优化器生成较差的运行计划。在bug修复前我们能够使用outline来强制SQL的运行计划的正确。 

Outline的机制是将所须要的运行计划的hint保存在outline的表中。当运行SQL时,Oracle会与outline中的SQL比較,假设该SQL有保存的outline,则通过保存的hint生成运行计划。 

Outline的使用注意事项 

Outline的使用须要注意下面事项。 

1. 

Outln用户是一个很重要的系统用户。其重要性跟sys,system一样。

在不论什么情况下都不建议用户删除outln。否则会引起数据库错误。

2. 

优化器通过Outline生成运行计划前提是outline内全部hint都有效的。如:索引没有创建的前提下,索引的hint是失效的。导致该SQL的outline计划不会被使用。

3. 

參数Cursor_sharing=force时不能使用outline。 

4. 

literial sql的共享程度不高,Outline针对绑定变量的sql较好。

针对literial sql的情况,须要每条sql都生成outline。

5. 

创建outline须要有create any outline的权限。 

6. 

要注意从CBO的角度来看,数据库表和索引的统计信息是随着数据量的变化而不断改变的。

固定的运行计划在某些时段并不一定是最优的运行计划。

所以outline的使用是要依据详细情况来决定的。

Outline使用举例 

本文举例说明怎样使用outline,而且将outline的内容从8i迁移到10g的数据库上使用。 

操作步骤以scott用户为例说明。

8i,10g中在scott用户下创建測试表以说明outline的使用. 

Login as scott 

Create table t_test(col1 varchar2(2)); 

1. 

确定8i生产库的db,listener处于关闭的状态。

2. 

启动8i生产库instance. 

3. 

8i库使用system用户登陆,赋create any outline权限给sql运行用户。 

Grant create any outline to scott; 

4. 

8i库使用scott用户登陆。 

Create outline t_ol1 for category special on select * from t_test where col1=’00’; 

T_ol1àoutline name 

(注意每一个outline都须要使用唯一的名字,不能反复) 

Specialàoutline所属的类(category) 

Select * from t_test where col1=’00’;à须要保存outline的sql 

5. 

10g,8i库Unlock并改动outlin用户口令。

注意,outln用户的口令能够改动可是outln用户不能删除。 

Alter user outln identified by outln account unlock; 

6. 

在8i库使用outln用户,导出outline数据。 

Exp outln/outln tables=ol/$ ol/$hints file=ol.dmp log=ol_exp.log 

将export的数据复制到10g库所在机器 

7. 

在10g库使用outln用户导入outline数据 

imp outln/outln file=ol.dmp ignore=y log=ol_imp.log 

8. 

在10g库使用sys用户更新ouline的signature 

connect sys/manager 

exec dbms_outln.update_signatures; 

启用stored outline 

alter system set use_stored_outlines=special; 

à指定outline category 

9. 

检測outline是否被使用 

connect scott/tiger 

create index I_test on t_test (col1); 

à创建索引。以改变运行计划 

explain plan for select * from t_test where col1=’00’; 

@?

/rdbms/admin/utlxplp 

PLAN_TABLE_OUTPUT 

Plan hash value: 4036493941 

---------------------------------------------------------------------------- 

| Id  | Operation                                         | Name      | Rows  | Bytes      | Cost (%CPU)| Time     | 

---------------------------------------------------------------------------- 

|   0 | select STATEMENT                       |                 |     1      |     3           |  1200   (4)       | 00:00:17 | 

|*1  |TABLE ACCESS FULL                   | T_TEST |     1      |     3           |  1200   (4)      | 00:00:17 | 

---------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 

--------------------------------------------------- 

   1 - filter("COL1"='00') 

Note 

----- 

   - outline "OL1" used for this statement 

à 

注意运行计划指出online已经使用 

17 rows selected. 

说明outline已经启用。 

假设没有outline的情况下应该使用索引,运行计划例如以下。 

PLAN_TABLE_OUTPUT 

-------------------------------------------------------------------------------- 

Plan hash value: 614253159 

--------------------------------------------------------------------------- 

| Id  | Operation                        | Name     | Rows  | Bytes | Cost (%CPU)| Time     | 

--------------------------------------------------------------------------- 

|   0 | select STATEMENT     |                |     1      |          3 |     3   (0)          | 00:00:01 | 

|*  1 |  INDEX RANGE SCAN| I_TEST |     1      |          3 |     3   (0)          | 00:00:01 | 

--------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 

--------------------------------------------------- 

   1 - access("COL1"='00') 

Outline维护 

停止db使用outline功能: 

alter system set use_stored_outlines=false; 

disable/enable详细outline: 

alter outline ol_name disable; 

alter outline ol_name enable; 

删除outline category: 

9i, 10g: exec dbms_outln.drop_by_cat(‘category_name’); 

8i: exec outln_pkg.drop_by_cat(‘category_name’); 

outline相关视图 

dba_outlines 

检查outline是否存在 

select 

name, category, owner from dba_outlines; 

dba_outline_hints 

这个视图列出outline的hints内容

版权声明:本文博客原创文章。博客,未经同意,不得转载。

【转】Oracle Outline使用方法及注意事项的更多相关文章

  1. Oracle Outline总结

    一.基本概述 Oracle Outline,中文也称为存储大纲,是最早的基于提示来控制SQL运行计划的机制.也是9i以及之前版本号唯一能够用来稳定和控制SQL运行计划的工具. outline是一个hi ...

  2. 部分常见ORACLE面试题以及SQL注意事项

    部分常见ORACLE面试题以及SQL注意事项 一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY ...

  3. Oracle VM VirtualBox使用的注意事项

    Oracle VM VirtualBox使用的注意事项 Oracle VM VirtualBox 上克隆虚拟机 方法一 1.复制源虚拟里的 vdi 文件到新的目录 2.命令行进入 Oracle VM  ...

  4. Linux任务调度进程crontab的使用方法和注意事项

    参考文章:Linux任务调度进程crond命令的使用方法和注意事项 一.crond简介 概念 crond的概念和crontab是不可分割的.crontab是一个命令,常见于Unix和类Unix的操作系 ...

  5. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  6. oracle 表迁移方法 (二) 约束不失效

    DB:11.2.0.3.0 在oracle 表迁移方法 (一)中,只是move了一张普通的表,如果表的字段带有主键约束呢 ? [oracle@db01 ~]$ sqlplus / as sysdba ...

  7. 【转】PLSQL developer 连接不上64位Oracle 的解决方法

    PLSQL developer 连接不上64位Oracle 的解决方法 快乐无极 , 2012/06/13 10:10 , 开发文档 , 评论(6) , 阅读(140430) , Via 本站原创 大 ...

  8. .net远程连接oracle数据库不用安装oracle客户端的方法

    .net远程连接oracle数据库不用安装oracle客户端的方法步骤: 1.添加Sytem.Data.OracleClient命名空间. 2.连接时需要ConnectionString字符串,出现在 ...

  9. oracle创建job方法

    oracle创建job方法  alter system enable restricted session;--创建表create table G_TEST ( ID     NUMBER(12), ...

随机推荐

  1. 一般报java.lang.NullPointerException的原因有以下几种

    一般报java.lang.NullPointerException的原因有以下几种: ·字符串变量未初始化: ·接口类型的对象没有用具体的类初始化,比如: List lt; 会报错 List lt = ...

  2. 【教你zencart仿站 文章1至6教训 高清1280x900视频下载】[支持手机端]

    [教你zencart仿站 第1至6课 高清晰1280x900视频下载][支持移动端] 经过筹备, 我们的课件最终出来了- 我们 zencart联盟合伙人 项目推出的 在线yy同步演示zencart仿站 ...

  3. python学习笔记之九:模块和包

    Python的标准安装包括一组模块,称为标准库.这里介绍模块的工作方式,学习如何使用它们. 一. 模块 1.1 用import从外部模块获取函数并为自己的程序所用: >>> from ...

  4. C++ 操作 MySQL

    使用VS2008如IDE, 准备操作: 1. 项目属性  C++ 其他包括文件夹 为 mysql 安装文件夹的include 如:"C:\Program Files (x86)\MySQL\ ...

  5. 在js中做数字字符串加0补位,效率分析

    分类: Jquery/YUI/ExtJs 2010-08-30 11:27 2700人阅读 评论(0) 收藏 举报 functiondate算法语言c 通常遇到的一个问题是日期的“1976-02-03 ...

  6. javascript于boolean类型转换,运营商&&和|| 返回值

    javascript它是弱类型语言,不管是什么类型的数据可以被转换成boolean种类.转换规则如下面的: 数据类型                 转换为boolean后的值 NAN         ...

  7. 图解Http协议 (转)

    一.技术基石及概述 问:什么是HTTP? 答:HTTP是一个客户端和服务器端请求和响应的标准TCP.其实建立在TCP之上的. 当我们打开百度网页时,是这样的: https://www.baidu.co ...

  8. Hdu-1565 电网接入(1) (国家压缩dp获得冠军

    正方形格通路(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. [LeetCode107]Binary Tree Level Order Traversal II 二叉树层次遍历

    题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...

  10. 解决PhpCms V9后台无法上传图片

    PHPCMS V9 在近期一次更新的版本号(9.4.2)中因为代码推断失误.导致PHPCMS在后台更新文章无法上传图片而导致的bug.在PHPCMS论坛中找到了暂时解决方式,希望PHPCMS官方能尽快 ...