【转】Oracle Outline使用方法及注意事项
概要 
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使用方法及注意事项的更多相关文章
- Oracle Outline总结
		
一.基本概述 Oracle Outline,中文也称为存储大纲,是最早的基于提示来控制SQL运行计划的机制.也是9i以及之前版本号唯一能够用来稳定和控制SQL运行计划的工具. outline是一个hi ...
 - 部分常见ORACLE面试题以及SQL注意事项
		
部分常见ORACLE面试题以及SQL注意事项 一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY ...
 - Oracle VM VirtualBox使用的注意事项
		
Oracle VM VirtualBox使用的注意事项 Oracle VM VirtualBox 上克隆虚拟机 方法一 1.复制源虚拟里的 vdi 文件到新的目录 2.命令行进入 Oracle VM ...
 - Linux任务调度进程crontab的使用方法和注意事项
		
参考文章:Linux任务调度进程crond命令的使用方法和注意事项 一.crond简介 概念 crond的概念和crontab是不可分割的.crontab是一个命令,常见于Unix和类Unix的操作系 ...
 - Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项
		
Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...
 - oracle 表迁移方法 (二) 约束不失效
		
DB:11.2.0.3.0 在oracle 表迁移方法 (一)中,只是move了一张普通的表,如果表的字段带有主键约束呢 ? [oracle@db01 ~]$ sqlplus / as sysdba ...
 - 【转】PLSQL developer 连接不上64位Oracle 的解决方法
		
PLSQL developer 连接不上64位Oracle 的解决方法 快乐无极 , 2012/06/13 10:10 , 开发文档 , 评论(6) , 阅读(140430) , Via 本站原创 大 ...
 - .net远程连接oracle数据库不用安装oracle客户端的方法
		
.net远程连接oracle数据库不用安装oracle客户端的方法步骤: 1.添加Sytem.Data.OracleClient命名空间. 2.连接时需要ConnectionString字符串,出现在 ...
 - oracle创建job方法
		
oracle创建job方法 alter system enable restricted session;--创建表create table G_TEST ( ID NUMBER(12), ...
 
随机推荐
- apache cxf之 一个简单的JAX-WS服务程序
			
推荐一本apache cxf的书籍: apache cxf的配置,这边就不做介绍了.请参照我关于它配置的博文. 开发步骤: 1.新建Java project,build path引入cxf runti ...
 - 基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql高性能php平台
			
一.安装准备 1.1平台环境: CentOS 5.4 x86_64 GNU/Linux nginx-0.8.21 php-5.2.9 spawn-fcgi-1.6.3 mysql-5.1.34 .2系 ...
 - python学习笔记之五:抽象
			
本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途. 一. 创建函数 函数是可以调用,它执行某种行为并且返回一个值.用def语句即可定义一个函数:(并非所 ...
 - WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(二)实现IRequestChannel(2016-03-15 12:35)
			
这是这个系列的第二篇,其他的文章请点击下列目录 WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(一)概要设计 WCF扩展之实现ZeroMQ绑定和protocolBuffer消息 ...
 - silverlight与wcf双向通讯 例子
			
本文将建立一个silverlight与wcf双向通讯的简单实例,以下是详细步骤: 新建Silverlight应用程序,名称WCFtest.解决方案中添加WCF服务应用程序,名称WcfServiceTe ...
 - 开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
			
原文:[原创]开源Math.NET基础数学类库使用(17)C#计算矩阵条件数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
 - Source Insight 光标变粗设置NotePad++光标设置
			
为了更好的查看文档和代码,避免半天都找不到光标的情况,故做此说明 Source Insight 光标变粗 菜单中 Options --->Preferences --->Typing -- ...
 - 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)
			
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23698511 今天继续对我们的csdn客户端未完成的功能进行实现,本篇博客接着客 ...
 - Duanxx的STM32学习: 启动模式,BOOT0和BOOT1具体解释
			
在画STM32的电路图的时候,关于STM32的启动方式纠结了一下,现有的參考设计都是在STM32的启动选择引脚BOOT0和BOOT1上使用了跳帽,用以人工选择STM32的启动方式,可是在实际应用中这样 ...
 - Oracle trunc()函数
			
Oracle trunc()函数的用法 --Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysd ...