• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >oracle > Oracle中基于hint的3种执行计划控制方法详细介绍

Oracle中基于hint的3种执行计划控制方法详细介绍

作者:beanbee 字体:[增加 减小] 来源:互联网 时间:2017-05-11

beanbee通过本文主要向大家介绍了oracle hint,oracle hint用法,oracle hint parallel,oracle hint index,oracle hint 索引等相关知识,希望本文的分享对您有所帮助

hint(提示)无疑是最基本的控制执行计划的方式了;通过在SQL语句中直接嵌入优化器指令,进而使优化器在语句执行时强制的选择hint指定的执行路径,这种使用方式最大的好处便是方便和快捷,定制度也很高,通常在对某些SQL语句执行计划进行微调的时候我会首选这种方式,不过尽管如此,hint在使用中仍然有很多不可忽视的问题;

使用hint过程中有一些值得注意的细则,首先便是要准确的识别对应的查询块,如果需要使用注释也可以hint中声明;对于使用别名的对象一律使用别名来引用,并且诸如“用户名.对象”的引用方式也不被允许,这几个都是我平时经常犯的错误,其实细心一点也就没什么关系了,不过最郁闷的是使用hint的过程中没有任何提示信息可以参考!!譬如语句中使用了无效的hint,Oracle并不会给予你任何相关的错误信息,相反这些hint会在执行时被默默的忽略,像什么都没发生一样。。

到这里,我并不想讨论如何正确的使用hint,我想说的是在Oracle中,仍然有很多可以控制执行计划的机制,11g中,有三种基于优化器hint的执行计划控制方式:

1.OUTLINE(大纲)
2.SQL PROFILE(概要文件)
3.SQL BASELINE(基线)

这些方式的使用比较hint更加的系统,完备,它们的出现很大程度上提高了hint这种古老的控制方式的实用性。

OUTLINE(大纲)

OUTLINE的原理是解析SQL语句的执行计划,在此过程中确定一套可以有效的强制优化器选择某个执行计划的hints,然后保存这些hints,当下次发生”相同“查询的时候,优化器便会忽略当前的统计信息因素,选用OUTLINE中记录的hints来执行查询,达到控制执行计划的目的。

OUTLINE的创建通常有两种方式,一种使用create outline语句,另一种便是借助于专属的DBMS_OUTLN包,使用Create outline方式时我们需要注明完整查询语句:

SQL> create outline my_test_outln for category test on
  2  select count(*) from scott.emp;

Outline created.
</div>

相比之下,DBMS_OUTLN.CREATE_OUTLINE方式允许通过已经保存在缓存区中的SQL语句的hash值来创建outline,因此更加常用,下面是签名:

DBMS_OUTLN.CREATE_OUTLINE (
   hash_value    IN NUMBER,
   child_number  IN NUMBER,
   category      IN VARCHAR2 DEFAULT 'DEFAULT');
</div>

category用于指定OUTLINE的分类,在一个会话中只能使用一种分类,分类的选择由参数USE_STORED_OUTLINES决定,该参数的默认值为FALSE,表示不适用OUTLINE,设置成TRUE则选用DEFAULT分类下的OUTLINE,如果需要使用非DEFAULT分类下的OUTLINE,可以设置该参数值为对应的分类的名称。

关于OUTLINE的视图通常可以查询DBA_OUTLINES,DBA_OUTLINE_HINTS,数据库中OUTLN用户下也有三张表用于保存OUTLINE信息,其中OL#记载了每一个OUTLINE的完整定义。
SQL> select TABLE_NAME,OWNER from all_tables where owner='OUTLN';

TABLE_NAME                     OWNER
------------------------------ ------------------------------
OL$                            OUTLN
OL$HINTS                       OUTLN
OL$NODES                       OUTLN

-- 查询当前系统中已有的OUTLINE已经对应OUTLINE使用的hints:
[sql]
SQL> select category,ol_name,hintcount,sql_text from outln.ol$;

CATEGORY   OL_NAME                         HINTCOUNT SQL_TEXT
---------- ------------------------------ ---------- --------------------------------------------------
TEST       MY_TEST_OUTLN                           6 select count(*) from scott.emp
DEFAULT    SYS_OUTLINE_13080517081959001           6 select * from scott.emp where empno=7654

-- 查询对应OUTLINE上应用的hints
SQL> select name, hint from dba_outline_hints where name = 'SYS_OUTLINE_13080517081959001';

NAME                           HINT
------------------------------ --------------------------------------------------------------------------------
SYS_OUTLINE_13080517081959001  INDEX_RS_ASC(@"SEL$1" "EMP"@"SEL$1" ("EMP"."EMPNO"))
SYS_OUTLINE_13080517081959001  OUTLINE_LEAF(@"SEL$1")
SYS_OUTLINE_13080517081959001  ALL_ROWS
SYS_OUTLINE_13080517081959001  DB_VERSION('11.2.0.1')
SYS_OUTLINE_13080517081959001  OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
SYS_OUTLINE_13080517081959001  IGNORE_OPTIM_EMBEDDED_HINTS

6 rows selected.
</div>

使用OUTLINE来锁定执行计划的完整实例:

-- 执行查询
SQL> select * from scott.emp where empno=7654;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

-- 查看该查询的执行计划
-- 注意这里的hash_value和child_number不可作为DBMS_OUTLN.CREATE_OUTLINE参数值,这些只是PLAN_TABLE中保存的执行计划的值!!!
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID  40t73tu9dst5y, child number 1
-------------------------------------
select * from scott.emp where empno=7654

Plan hash value: 2949544139

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |      1 |   &nb

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ORACLE中的的HINT详解
  • Oracle中基于hint的3种执行计划控制方法详细介绍

相关文章

  • 2017-05-11新Orcas语言特性-查询句法
  • 2017-05-11Oracle随机函数之dbms_random使用详解
  • 2017-05-11oracle生成动态前缀且自增号码的函数分享
  • 2017-05-11oracle中动态SQL使用详细介绍
  • 2017-05-11Oracle 监控索引使用率脚本分享
  • 2017-05-11Oracle常见错误代码的分析与解决
  • 2017-05-11深入剖析哪些服务是Oracle 11g必须开启的
  • 2017-05-11oracle查询锁表与解锁情况提供解决方案
  • 2017-05-11oracle 创建表空间步骤代码
  • 2017-05-11Oracle ASM数据库故障数据恢复解决方案

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • Oracle新建用户、角色,授权,建表空间的sql语句
    • Oracle连接远程数据库的四种方法
    • Oracle DBA常用语句第1/2页
    • Oracle文本函数简介
    • 数据库数据恢复及表恢复
    • 在Linux下安装Oracle
    • oracle10g 数据备份与导入
    • ORACLE常见错误代码的分析与解决(二)
    • Oracle多表级联更新详解
    • win平台oracle rman备份和删除dg备库归档日志脚本

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有