当前位置:  数据库>oracle

关于Oracle Outline使用

    来源: 互联网  发布时间:2017-06-16

    本文导语: 一、基本概述 Oracle Outline,中文也称为存储大纲,是最早的基于提示来控制SQL执行计划的机制,也是9i以及之前版本唯一可以用来稳定和控制SQL执行计划的工具。 outline是一个hints(提示)的集合,更具体的讲,outline可以锁定一...

一、基本概述

Oracle Outline,中文也称为存储大纲,是最早的基于提示来控制SQL执行计划的机制,也是9i以及之前版本唯一可以用来稳定和控制SQL执行计划的工具。

outline是一个hints(提示)的集合,更具体的讲,outline可以锁定一个给定SQL的执行计划,保持其执行计划稳定,不管数据库环境如何变更(如统计信息,部分参数等)

注意:

1. 从10g以后,oracle连续发布了sql profile和sql baseline来实现SQL执行计划的控制,并且outline这个工具基本已经被Oracle废弃并且不在维护,但是不管怎么说,在10g以及11g版本都还是可以使用,而且这个特性也一直使用的很好。
2. 10g以后建议使用sql profile或者sql baseline
3. 由于目前outline现在已经很少使用,此文也尽量介绍实用的一部分

二、运行机制
Outline将执行计划的hint集合保存在outline的表中(数据字典)。当执行SQL解析时,Oracle会与outline中的SQL比较,如果该SQL有保存的outline,则通过保存的hint集合生成指定执行计划。
注意:
1. SQL解析时,使用SQL文本却匹配数据字典outline保存的文本,此处匹配的方式为去掉SQL空格,忽略SQL大小写区别后,进行的比较。
2. 例如,select * from dual 和SELECT * FROM dual这两个语句将使用同样的outline。

三、使用场景

1. 为避免在升级后某些SQL出现严重性能下降而且在短时间内不能优化的情况,我们可以使用outline的功能将原生产库中的sql执行计划实施在新的数据库上。
2. 为避免SQL的执行计划在统计数据不准确的情况(如未能及时收集表或索引的统计信息)下导致变化从而引起的性能降低。
3. 为避免容易因为Bind Peeking导致SQL执行计划变差从而引起的性能降低。
4. 避免大规模分布实施的应用出现数据库版本、配置等区别引起的优化器产生不同的执行计划。
5. 某些Bug引起优化器生成较差的执行计划。在bug修复前我们可以使用outline来强制SQL的执行计划的正确。
6. 早期优化器版本从rule转换为cbo模式时,过渡期间用来维护业务稳定(执行计划稳定)

注意

任何一个数据库中,大部分的SQL语句执行计划应该是通过优化器自动生成,并且高效运行,而只有极少部分,需要通过各种工具(outine、sql profile)来锁定执行计划

四、注意事项

1. outline存在在outln用户中,Outln用户是一个非常重要的系统用户,其重要性跟sys,system一样。在任何情况下都不建议用户删除outln,否则会引起数据库错误。
2. 优化器通过Outline生成执行计划前提是outline内所有hint都有效的。
3. 只有设置use_stored_outlines参数后才能启用outline。
4. 使用字面值的sql的共享程度不高(没有使用绑定变量),Outline针对绑定变量的sql较好。针对使用字面值的sql的情况,需要每条sql都生成outline。
5. 创建outline需要create any outline or execute_catelog_role权限 。
6. 要注意从CBO的角度来看,数据库表和索引的统计信息是随着数据量的变化而不断改变的。固定的执行计划在某些时段并不一定是最优的执行计划。所以outline的使用是要根据具体情况来决定的。
7. 第一次应用Outline (alter system )这个操作是会产生Library cache pin的,需谨慎。
8. 10.2.0.4 outline bug 6455659
9. use_stored_outlines参数重启后失效,需要重新设置
10. 当outline依赖的对象被删除时,outline并不会自动删除

五、outline相关的视图

• 两个基本视图:dba_outlines,dba_outline_hints
• 三个底层表:ol$、ol$hints、ol$nodes

六、使用outline

一、创建outline

创建outline的方法有三种,下面我们一一简单介绍

1、给会话甚至整个系统执行的每一条SQL语句都创建outline,可以设置如下参数,分别针对会话级和系统级

ALTER SYSTEM SET create_stored_outlines=TRUE;

ALTER SESSION SET create_stored_outlines=TRUE;

注意:基本上没有任何一个数据库会这么做,因此这种方式我们不做测试;

2、手工通过CREATE OUTLINE方式来创建给定SQL语句的outline,如下

CREATE or replace OUTLINE outline_dh_test FOR CATEGORY test on select * from dh_stat where id=11;

or

CREATE or replace OUTLINE outline_dh_test1 on select * from dh_stat where id=11;

示例:

SQL> CREATE or replace OUTLINE outline_dh_test FOR CATEGORY test on select * from dh_stat where id=11;

Outline created.
SQL> set linesize 200 pagesize 999
SQL> set long 30
SQL> set long 50
SQL> select name,owner,category,used,sql_text from dba_outlines;
NAME OWNER CATEGORY USED SQL_TEXT
------------------------------ ------------------------------ ------------------------------ ------
 OUTLINE_DH_TEST DBMON TEST UNUSED select * from dh_stat where id=11
SQL> select name,hint from dba_outline_hints;
NAME HINT
------------------------------ --------------------------------------------------
 OUTLINE_DH_TEST FULL(@"SEL$1" "DH_STAT"@"SEL$1")
 OUTLINE_DH_TEST OUTLINE_LEAF(@"SEL$1")
 OUTLINE_DH_TEST ALL_ROWS
 OUTLINE_DH_TEST OPT_PARAM('_optimizer_use_feedback' 'false')
 OUTLINE_DH_TEST OPT_PARAM('_optimizer_adaptive_cursor_sharing' 'fa
 OUTLINE_DH_TEST OPT_PARAM('_optimizer_extended_cursor_sharing_rel'
 OUTLINE_DH_TEST OPT_PARAM('_bloom_pruning_enabled' 'false')
 OUTLINE_DH_TEST OPT_PARAM('_gby_hash_aggregation_enabled' 'false')
 OUTLINE_DH_TEST OPT_PARAM('_optimizer_extended_cursor_sharing' 'no
 OUTLINE_DH_TEST OPT_PARAM('_bloom_filter_enabled' 'false')
 OUTLINE_DH_TEST OPT_PARAM('_optimizer_null_aware_antijoin' 'false'
 OUTLINE_DH_TEST OPT_PARAM('_optim_peek_user_binds' 'false')
 OUTLINE_DH_TEST DB_VERSION('11.2.0.1')
 OUTLINE_DH_TEST OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
 OUTLINE_DH_TEST IGNORE_OPTIM_EMBEDDED_HINTS
15 rows selected.
注意:

• 不指定outline类别是,默认为default,而且此处创建时,不能指定为default类别(会报错)。
• 这个方法不是很方便,因为必须将整个SQL文本作为语句的一部分,可能导致语句无法共享等问题,因此很少使用这种方法

3、从10g起,可以通过引用共享池中已经存在的SQL语句来创建outline

exec DBMS_OUTLN.create_outline(hash_value=>1752921103,child_number => 0,category=>'test');

注意
• 这种方法不能指定outline的具体名字,由系统自动生成,可以通过alter outline SYS_OUTLINE_14061114223605901 rename to dh_test2修改
• 不指定类别的话默认为default,而且此处创建时,不能指定为default类别(会报错)。
• 我们使用outline固定执行计划时,一般都是选用此种方法
• 后面有一个简单示例,可以加深理解。

更多详情见请继续阅读下一页的精彩内容:


    
 
 

您可能感兴趣的文章:

  • linux下安装oracle后使用命令行启动的方法 linux启动oracle
  • Oracle9i 9.0.1的JDBC Drivers 可以给Oracle 8.0.5使用马?
  • Suse linux使用oracle问题
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • jbuilder中使用oracle的问题
  • 求redhat linux 9.0下可以使用的oracle 10g或9i,还有redhat linux 9.0下可以使用的eclipse下载地址
  • Oracle事务!使用游标提交过程
  • 在Jbuilder7下,使用DbPilot.exe连接oracle,报错!请教高手!
  • AIX 64位系统上如何使用32位OCI oracle driver
  • Oracle中SQL语句连接字符串的符号使用介绍
  • 使用X manager连接oracle数据库的步骤
  • C++使用OCCI连Oracle10g的错误
  • 使用工具 plsqldev将Excel导入Oracle数据库
  • Linux下Oracle的sqlplus使用光标上下左右方法
  • Oracle 数据 使用游标
  • oracle使用sql脚本生成csv文件案例学习
  • ORACLE 修改表结构 之ALTER CONSTAINTS的使用
  • Linux中Oracle使用相关知识集锦
  • Oracle密码文件的使用和维护第1/3页
  • Oracle 触发器的使用小结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 移动开发 iis7站长之家
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3