概要
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), ...
随机推荐
-
使用idea debug多线程
最近采用hystrix远程访问webservice, 遇到一个重定向303的exception,想要debug一下,发现打了断点后总是被跳过.想到hystrix异步线程的问题,于是想要debug就得支 ...
-
【平面设计AFTER】读到的设计海报分层法
来源参考:http://www.uisdc.com/graphic-designer-self-improvement 分层法的三层:“背景层”,“图形层”,“信息层” 1,背景层,一般为纯色,场景, ...
-
php 分析
php code in D:\10\11\php test in D:\10\11\php\test issue 1: <html><head><title>标记 ...
-
SQL Server 2012 案例教程(贾祥素)——学习笔记
第2章 SQL Server 2012概述 1.SQL(Structed Query Language),结构化查询语言. 2.SSMS(SQL Server Mangement Studio),SQ ...
-
07 设置View的显示与隐藏
在代码中: 例子: <span style="font-size:14px;">ImageButton imageButton = new ImageButton(th ...
-
[ 严重 ] my网SQL注入
RANK 80 金币 100 数据包 POST maoyan.com/sendapp HTTP/1.1Host: xxx.maoyan.comUser-Agent: Mozilla/5.0 ( ...
-
image的srcset属性
介绍 响应式页面中经常用到根据屏幕密度设置不同的图片.这个时候肯定会用到image标签的srcset属性.srcset属性用于设置不同屏幕密度下,image自动加载不同的图片.用法如下: <im ...
-
微信小程序可以转发给微信好友了
微信小程序又放大招了:小程序页面可以放置转发按钮,分享更流畅.同时开放了微信运动步数.背景音乐播放等更多基础能力.小程序可以在自己的页面上放置转发按钮,用户点击后,即可将喜欢的内容分享给好友或群聊,体 ...
-
粗略的整改一下blog
一.先找个简约的模板:看个人喜好咯 二.页面定制CSS: 1.首先,查看主页源码,了解一下各个标签的id,引用的class等 2.通过操作相应的id,class,和标签,进行个性化.这里需要具备看懂和 ...
-
Python学习之全局变量与global
刚学习Python,遇到个问题:为什么有些定义在函数外的变量可以直接被函数使用,有些就不行呢? 如: count = 0 def change(): count += 1 change() # 报错 ...