【转】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的使用及注意事项

时间: 2024-10-10 20:45:39

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

Oracle Outline总结

一.基本概述 Oracle Outline,中文也称为存储大纲,是最早的基于提示来控制SQL执行计划的机制,也是9i以及之前版本唯一可以用来稳定和控制SQL执行计划的工具. outline是一个hints(提示)的集合,更具体的讲,outline可以锁定一个给定SQL的执行计划,保持其执行计划稳定,不管数据库环境如何变更(如统计信息,部分参数等) 注意: 从10g以后,oracle连续发布了sql profile和sql baseline来实现SQL执行计划的控制,并且outline这个工具基本

oracle 安装过程中的注意事项

场景描述: oracle 安装过程中,dbca创建数据库的过程中,出现标题中的错误! 检测确认环境:防火墙已经关闭. 原因是:这里有一个需要注意的事项,在设置oracle数据库用户(sys,system...)密码的时候,密码中不能含有“@”符号!!!否则安装过程会报ora-12145错误. 操作建议: 出现上述错误,虽然选择ignore忽略可以继续安装,后续数据库也能正常使用. 但是,这里的操作建议是,先选择忽略该报错选项,继续安装,完成之后,重新执行dbca,将刚才创建的数据库删除,然后再重

Oracle RMAN备份与还原注意事项

1 备份文件管理 如果要删除之前的备份,不要手动去目录下删除,应该在rman命令模式下使用删除命令,否则虽然在磁盘上把物理备份文件删除了,但是使用备份查看命令会一直看到已经删除的备份文件 list backup; 查看当前系统有哪些可用的备份文件 list backupset summary; 查看备份文件的概要信息 crosscheck backup; 更新rman备份信息,如果有损坏的不可用的,或者手动删除的物理备份文件都可以通过此命令查看ex delete expired backup;

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

一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id) ) CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) 建表时注意不要用关键字当表名或字段名,如insert

Oracle Secure Global Desktop 部署考虑事项

你可以在这里找到原始文章. 概要 本文描述了Oracle Secure Global Desktop部署的设计和测试过程的整体过程.目的是帮助IT部门制定应用程序的部署策略,以满足IT部门和业务部门的需求. 目前IT组织的最大挑战就是为分散在各个地域的用户提供对其特定工作区(应用程序和桌面)的即时,可靠,无性能退化的访问.此外,管理者也需要对这些分散到各个地域的工作区进行集中的访问管理.这并不容易.很多客户通过使用Oracle Secure Global Desktop部署工作区来为其数以千计的

使用oracle utl_http包需要注意的事项

总结下几次使用utl_http包遇到的几个问题 关于utl_http包功能还是很强大的 可以通过他来捕捉网站页面的内容 或者调用一个url的接口完成某项功能 Eg: declare req  UTL_HTTP.REQ; resp UTL_HTTP.RESP; v_text varchar2(4000); begin --here you can insert other code even procedure or funciton --my codeing is etl monitor v_t

oracle 使用rownum分页及注意事项

一.使用rownum 分页未进行排序操作 select * from (select rownum rn,t.* from test_packet t) where rn between 1 and 10 执行结果如下 二.如果上面sql加上排序 执行结果如下 这样的结果是错误,rownum 也被打乱 应该把上面语语句改为 执行结果如下,得到这样的结果才是正确的 因此,如果使用rownum进行分页,要进行排序操作,则先排序,再使用rownum进行分页操作 原文地址:http://blog.51c

ORACLE数据库扩容

本文档实施目标 AIX  表空间:ITDB  方式:裸设备方式扩容方案      作者:johncoco 日期:2016/1/29 1.查询oracle数据库表空间ITDB使用到的裸设备文件,注意裸设备文件( 开头带r)与裸设备(不带r)的区别 查询表空间已使用的裸设备文件名称 >select * from  DBA_DATA_FILES where tablespace_name = 'ITDB'; /dev/rora_uip_tbs01 . . /dev/rora_uip_tbs27 这些裸

专家精讲Oracle数据库管理与维护pdf

下载地址:网盘下载 编辑推荐 <专家精讲:ORACLE数据库管理与维护>适合数据库开发人员参考学习,也可作为高等院校相关专业师生的参考书. 作者简介 张天慧,现任职华硕集团昌硕科技(上海)有限公司DBA,曾任华硕电脑DBA.NCR专业顾问.台湾积体电路约聘DBA.远传电信DBA,以及和信电信DBA,具有美商甲骨文OCP(Oracle Certified Pro.fessional)认证资格,并拥有8年以上数据库开发与DBA经验.Oracle数据库管理.备份与复原.性能调优SQL Serve数据