设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 742|回复: 1
收起左侧

南京Oracle认证培训分享Oracle Hint的正确使用姿势

[复制链接]
发表于 2016-9-29 11:56:12 | 显示全部楼层 |阅读模式
  本文南京万和Oracle认证培训和大家来说说Oracle Hint的正确使用姿势,小伙伴们快来get吧!

  一、提示(Hint)概述

  1.为什么引入Hint?

  Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。

  但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint就是Oracle提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。

  2.不要过分依赖Hint

  当遇到SQL执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加Hint了事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然不能SQL按优化的执行计划执行时,才考虑Hint。

  毕竟使用Hint,需要应用系统修改代码,Hint只能解决一条SQL的问题,并且由于数据分布的变化或其他原因(如索引更名)等,会导致SQL再次出现性能问题。更多内容,请咨询南京万和Oracle认证培训

  3.Hint的弊端

  Hint是比较"暴力"的一种解决方式,不是很优雅。需要开发人员手工修改代码。

  Hint不会去适应新的变化。比如数据结构、数据规模发生了重大变化,但使用Hint的语句是感知变化并产生更优的执行计划。

  Hint随着数据库版本的变化,可能会有一些差异、甚至废弃的情况。此时,语句本身是无感知的,必须人工测试并修正。

  4.Hint与注释关系

  提示是Oracle为了不破坏和其他数据库引擎之间对SQL语句的兼容性而提供的一种扩展功能。Oracle决定把提示作为一种特殊的注释来添加。它的特殊性表现在提示必须紧跟着DELETE、INSERT、UPDATE或MERGE关键字。

  换句话说,提示不能像普通注释那样在SQL语句中随处添加。且在注释分隔符之后的第一个字符必须是加号。在后面的用法部分,会详细说明。更多内容,请咨询南京万和Oracle认证培训

  5.Hint功能

  Hint提供的功能非常丰富,可以很灵活地调整语句的执行过程。通过Hint,我们可以调整:

  优化器类型

  优化器优化目标

  数据读取方式(访问路径)

  查询转换类型

  表间关联的顺序

  表间关联的类型

  并行特性

  其他特性

  二、Hint用法

  1.语法

  1)关键字说明

  DELETE、INSERT、SELECT和UPDATE是标识一个语句块开始的关键字,包含提示的注释只能出现在这些关键字的后面,否则提示无效。

  "+"号表示该注释是一个提示,该加号必须立即跟在"/*"的后面,中间不能有空格。

  hint是下面介绍的具体提示之一,如果包含多个提示,则每个提示之间需要用一个或多个空格隔开。

  text是其它说明hint的注释性文本

  2)提示中的错误

  提示中的语法错误不会报错,如果解析器不能解析它,就会把它看做一个普通注释处理。这也是容易造成困惑的一点,使用的Hint到底是否起效?可以采用一些手段,检查提示的有效性。需要注意的是,那些语法正确但引用对象错误的提示是不会被报告的。

  ◎explain plan + dbms_xplan

  使用dbms_xplan输出中的note选项。

  ◎10132事件

  在10g中,这个事件产生的输出文档的末尾有一部分内容专门讲提示。通过它可以检查两个方面:一是每个用到的提示都会被列出来。如果漏掉了哪个,就说明这个提示没有被识别;二是检查是否有一些信息指明了出现提示错误(如果出错,err值将大于0)。

  3)提示中的对象

  SELECT /*+ INDEX(table_name index_name) */ ...

  table_name是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名。

  index_name可以不必写,Oracle会根据统计值选一个索引。

  如果索引名或表名写错了,那这个hint就会被忽略。

  如果指定对象是视图,需要按此方法指定。/*+hint view.table ...*/,其中table是view中的表。

  一个很常见的错误时,在使用提示的时候最易犯的错误是与表的别名有关。正确的规则是,当在提示中使用表时,只要表有别名就应该使用别名而不是表名。更多内容,请咨询南京万和Oracle认证培训

  2.提示的作用域

  查询块

  初始化参数提示对整个SQL语句起作用,其他的提示仅仅对查询块起作用。仅仅对单个查询块起作用的提示,必须在它控制的查询块内指定。


                               
登录/注册后可看大图

  例外 - 全局提示

  可以使用点号引用包含在其他查询块(假设这些块已命名)中的对象。全局提示的语法可以支持两层以上的引用,对象间必须用点号分隔。


                               
登录/注册后可看大图

  命名查询块

  既然where子句中的子查询是没有命名的,它们的对象就不能被全局提示引用。为了解决这个问题,10g中使用了另一种方法来解决-命名查询块。查询优化器可以给每个查询生成一个查询块名,而且还可以使用提示qb_name手工为每个查询块命名。大多数提示都可以通过参数来指定在那个查询块中有效。更多内容,请咨询南京万和Oracle认证培训


                               
登录/注册后可看大图

  *在提示中通过@来引用一个查询块。

  3.提示数据字典

  Oracle在11g的版本中提供了一个数据字典—V$SQL_HINT。通过这个数据字典可以看到提示的出现版本、概要数据版本、SQL特性以及相反提示等。


                               
登录/注册后可看大图

  INVERSE

  这个hint相反操作的hint。

  VERSION

  代表着这个hint正式公布引入的版本。

   想和兴趣相投的朋友们一起交流吗?那就来江苏万和计算机培训中心吧。而江苏万和作为南京专业的Oracle认证培训中心,也是Oracle等众多厂商的授权培训、考试机构,欢迎广大有志于此行业发展的学员们加入。

发表于 2016-9-29 12:17:01 | 显示全部楼层
路过了解一下
沙发 2016-9-29 12:17:01 回复 收起回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-1-22 21:45 , Processed in 0.066162 second(s), 10 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表