oracle 多个hint用法,Hint用法

本文详细介绍了Oracle SQL中的提示(hint)使用规范,包括语法、作用域和有效性检查。提示可以影响查询优化器的选择,如INDEX用于指定索引。错误的提示语法不会报错,但可能不被识别。通过V$SQL_HINT数据字典和特定事件可以检查提示的使用情况。命名查询块和全局提示允许更精确地控制提示的应用。
摘要由CSDN通过智能技术生成

详情:1语法

43b69fa84036344652c8cba514eeb7bf.png

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中的表。

一个很常见的错误时,在使用提示的时候最易犯的错误是与表的别名有关。正确的规则是,当在提示中使用表时,只要表有别名就应该使用别名而不是表名。

2提示的作用域

查询块

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

46734ea3bf18b7d142b3af9143a47e71.png

例外 - 全局提示

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

f77ffee25f7150cb6bf38a8feca8b94a.png

命名查询块

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

21e62817f12966be046253ff51fb52b4.png

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

3提示数据字典

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

b08dc73958d3f46825429383ff4713c5.png

INVERSE

这个hint相反操作的hint。

VERSION

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值