Oracle之Hint使用总结

更新时间:2023-06-15 00:09:30 阅读: 评论:0

Oracle之Hint使⽤总结
导读:
⼀、关于hint
1、引⼊hint的原因;
2、不能过分依赖hint;
3、hint的弊端;
4、hint和注释的关系;
5、hint的功能。
⼆、hint的具体⽤法
1、hint的语法;
2、hint的作⽤域;
3、hint数据字典。
三、hint的分类
1、和优化器相关的;
2、和访问路径相关的;
3、和查询转换相关的;
4、和表连接顺序相关的;
5、和表操作相关的;
6、和并⾏相关的;
7、其他相关的。节电公司>沐浴露能洗头吗
⼀、关于hint
1、为什么要引⼊hint?
Hint是Oracle数据库提供的⼀种机制⽤来告诉优化器按照hint告诉它的⽅式⽣成执⾏计划,是很多DBA优化中常⽤的⼀个⼿段。冰箱温度
为什么Oracle引⼊优化器呢?
基于代价的优化器,在绝⼤多数情况下会选择正确的优化器,减轻DBA的负担。但是有时候会选择效率很差的执⾏计划,使某个语句变得很慢,此时就需要DBA认为⼲预,告诉
优化器使⽤指定的存取路径或者连接类型⽣成执⾏计划,从⽽使语句⾼效地运⾏。
2、不能过分依赖hint
当遇到不好的执⾏计划时,应该优先考虑统计信息等问题,⽽⾮直接加hint。若统计信息⽆误,再考虑物理结构是否合理,即有没有合适的索引。只有在最后任然不能按照
优化的sql执⾏计划执⾏时,才考虑hint。
因为使⽤hint,需要系统修改代码,hint只能解决⼀条sql的问题,并且由于数据分布的变化或其他原因(如索引改名等),会导致sql再次出现性能问题。
3、hint的弊端
(1)、hint是⽐较“暴⼒”的⼀种解决⽅式。需要开发⼈员⼿⼯修改代码。
(2)、hint不会去适应新的变化。⽐如数据结构、数据规模发⽣了重⼤变化,使⽤Hint的语句是不会感知变化并产⽣更优的执⾏计划。
(3)、hint随着数据库版本的变化,可能会有⼀些差异、甚⾄废弃的情况。此时,还需要⼈⼯取修改。
4、hint与注释的关系
提⽰是Oracle为了不破坏和其他数据库引擎之间对SQL语句的兼容性⽽提供的⼀种扩展功能。
Oracle决定把提⽰作为⼀种特殊的注释来添加。它的特殊性表现在提⽰必须紧跟着DELETE、INSERT、UPDATE或MERGE关键字。
如inrt /*+append*/ into
5、hint的功能
通过hint可以灵活地调整语句的执⾏过程。
通过Hint,我们可以调整:优化器类型、优化器优化⽬标、数据读取⽅式(访问路径)、查询转换类型、
表间关联的顺序、表间关联的类型、并⾏特性、其他特性。
⼆、hint的具体⽤法
1、hint语法:{DELETE|INSERT|SELECT|UPDATE}/*+ hint [text] [hint[text]]*/
or {DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]
(1)、关键字说明
林姓男孩名字大全
hint提⽰只能出现在4个关键字后⾯;
“+”号表⽰此注释是⼀个提⽰,必须紧跟“/*”,且中间不能有空格;
如果包含多个提⽰,则每个提⽰之间需要⽤⼀个或多个空格隔开;
text是其他说明hint的注释性⽂本。
(2)、hint中的错误
hint中的语法错误不会报错,如果解析器不能解析,就会把它看做⼀个普通的注释处理。关于春节的英语小报
六年级上册数学第二单元
explain plan + dbms_xplan :使⽤dbms_xplan输出中的note选项。
ora-10132事件:在10g中,这个事件产⽣的输出⽂档的末尾有⼀部分内容专门讲提⽰。
通过它可以检查两个⽅⾯:⼀是每个⽤到的提⽰都会被列出来。如果漏掉了哪个,就说明这个提⽰没有被识别;
⼆是检查是否有⼀些信息指明了出现提⽰错误(如果出错,err值将⼤于0)。
(3)、hint中的对象
SELECT /*+ INDEX(TABLE_NAME INDEX_NAME)*/ ...
table_name是必须要写的,且如果在查询中使⽤了表的别名,在hint也要⽤表的别名来代替表名。散发的近义词是什么
注:a、index_name可以不必写,Oracle会根据统计值选⼀个索引。
b、如果索引名或表名写错了,那这个hint就会被忽略。
c、如果指定对象是视图,需要按此⽅法指定。/*+hint view.table ...*/,其中table是view中的表。
d、⼀个很常见的错误是,在使⽤提⽰的时候最易犯的错误是与表的别名有关。正确的规则是,当在提⽰中使⽤表时,只要表有别名就应该使⽤别名⽽不是表名。
2、hint的作⽤域
(1)、查询块
初始化参数提⽰对整个sql语句起作⽤,其他的提⽰仅对查询块起作⽤。
仅仅对单个查询块起作⽤的提⽰,必须在它控制的查询块内指定。
with temp_tb1 as {
lect /*+ full(temp)*/id,count(1) cnt from temp group by id
}
lect /*+ full(temp_tb2)*/ id,name,cnt from temp_tb2,temp_tb1 where temp_tb2.id=temp_tb1.id;
(2)、例外-全局提⽰
可以使⽤点号引⽤包含在其他块(假设这些块已命名)中的对象。类似Java中的静态成员。
with temp_tb1 as {
lect id,count(1) cnt from temp group by id
}
lect /*+ full(temp) full(p)*/ id,name,cnt from temp_tb2,temp_tb1 where temp_tb2.id=temp_tb1.id;
(3)、命名查询块
既然where⼦句中的⼦查询是没有命名的,它们的对象就不能被全局提⽰引⽤。为了解决这个问题,10g中使⽤了另⼀种⽅法来解决-命名查询块。查询优化器可以给每个查
询⽣成⼀个查询块名,⽽且还可以使⽤提⽰qb_name⼿⼯为每个查询块命名。⼤多数提⽰都可以通过参数来指定在那个查询块中有效。
with temp1 as {
lect /*+ qb_name(sq)*/ id,count(1)cnt from temp group by id
}
lect /*+ qb_name(main) full(@main temp2) full(@sq temp) */ temp.name,temp1t
from temp,temp1 where temp.id=temp1.id;
在hint中通过@来引⽤⼀个查询块。
3、hint数据字典
Oracle在11g的版本中提供了⼀个数据字典—V$SQL_HINT。通过这个数据字典可以看到提⽰的出现版本、概要数据版本、SQL特性以及相反提⽰等。
lect * from v$sql_hint where version like '%11%';
三、hint的分类
1、优化器相关的
当对优化器为某个语句所制定的基本执⾏计划不满意时,最好的⽅法是通过提⽰来改变执⾏计划,并观察改变后是否达到 期望的程度。 OPT_PARAM:作⽤是使某条语句中指定某个系统参数值;
ALL_EOWS:实现查询语句整体最优化⽽引导优化器制定最少成本的执⾏计划。优化器会选择⼀条可最快检索所有查询⾏的路径,代价就是检索⼀⾏时,速度会很慢。
FIRST_ROWS:为获得最佳响应时间⽽引导优化器制定最少成本的执⾏计划。这个提⽰会使优化器选择可最快检索出查询的第⼀⾏(或指定⾏)数据的路径,⽽代价就是检索很
多⾏时速度就会很慢。利⽤FIRST_ROWS来优化的⾏数,默认值为1,这个值介于10到1000之间,这个使⽤FIRST_ROWS(n)的新⽅法是完全基于代价的⽅法。它对n很敏感,
如果n值很⼩,CBO就会⽣成包含嵌套循环以及索引查找的计划;如果n很⼤,CBO会⽣成由哈希连接和全表扫描组成的计划(类似
ALL_ROWS)。
CHOOSE:依据SQL中所使⽤到的表的统计信息存在与否,来决定使⽤RBO还是CBO。在CHOOSE模式下,如果能够参考表的统计信息, 则将按照ALL_ROWS⽅式执⾏。除
⾮在查询中的所有表都没有经过分析,否则choo提⽰会对整个查询使⽤基于代价的优化。如果在多表连接中有⼀个表经过分析过,那么就会对整个查询进⾏基于代价的优
化。
RULE:使⽤基于规则的优化器来实现最优化执⾏,即引导优化器根据优先顺序规则来决定查询条件中所使⽤到的索引或运算符的执⾏ 顺序来制定执⾏计划。这个提⽰强制
oracle优先使⽤预定义的⼀组规则,⽽不是对数据进⾏统计;同时该提⽰还会使这个语句避免使⽤其他提⽰,除了DRIVING_SITE和ORDERED(不管是否进⾏基于规则的优化,
这两个提⽰都可使⽤)。
2、和访问路径相关的
FULL:告诉优化器通过全表扫描⽅式访问数据。这个提⽰只对所指定的表进⾏全表扫描,⽽不是查询中的所有表。FULL提⽰可以改善性能。这主要是因为它改变了查询中的
驱动表,⽽不是因为全表扫描。在使⽤其他某些提⽰时,也必须使⽤FULL提⽰。只有访问整个表时,才可利⽤CACHE提⽰将表进⾏缓存。并⾏组中的某些提⽰也必须使⽤全表
扫描。
CLUSTER:引导优化器通过扫描聚簇索引来从索引表中读取数据。
HASH:引导优化器按照哈希扫描的⽅式从表中读取数据。
INDEX:告诉优化器对指定表通过索引的⽅式访问数据。当访问数据会导致结果集不完整时,优化器将忽略这个Hint。
NO_INDEX:告诉优化器对指定表不允许使⽤索引。这个提⽰会禁⽌优化器使⽤指定索引。可以在删除不必要的索引之前在许多查询中禁⽌索引。如果使⽤了NO_INDEX,但
是没有指定任何索引,则会执⾏全表扫描。如果对某个索引同时使⽤了NO_INDEX和会之产⽣冲突的提⽰(如INDEX),这时两个提⽰都会被忽略掉。
INDEX_ASC:利⽤索引从表中读取数据时,引导优化器对提⽰中所指定索引的索引列值按照升序使⽤范围扫描。
INDEX_COMBINE:告诉优化器强制选择位图索引。这个提⽰会使优化器合并表上的多个位图索引,⽽不是选择其中最好的索引(这是INDEX提⽰的⽤途)。还可以使⽤
index_combine指定单个索引(对于指定位图索引,该提⽰优先于INDEX提⽰)。对于B树索引,可以使⽤AND_EQUAL提⽰⽽不是这个提⽰。
INDEX_JOIN:索引关联,当谓词中引⽤的列上都有索引的时候,可以通过索引关联的⽅式来访问数据。这个提⽰可以将同⼀个表的各个不同索引进⾏合并,这样就只需要访问
这些索引就可以了,节省了回表查询的时间。但只能在基于代价的优化器中使⽤该提⽰。这个提⽰不仅允许只访问表上的索
引, 这样可以扫描更少的代码块,并且它
⽐使⽤索引并通过rowid扫描整个表快5倍。拉碌碡
INDEX_DESC:利⽤索引从表中读取数据时,引导优化器对提⽰中所指定索引的索引列值按照降序使⽤范围扫描。
INDEX_FFS:告诉优化器以INDEX FFS(index fast full scan)的⽅式访问数据。INDEX_FFS提⽰会执⾏⼀次索引的快速全局扫描。这个提⽰只访问索引,⽽不是对应的表。只
有查询需要检索的信息都在索引上时,才使⽤这个提⽰。特别在表有很多列时,使⽤该提⽰可以极⼤地改善性能。
INDEX_SS:强制使⽤index skip scan的⽅式访问索引。当在⼀个联合索引中,某些谓词条件并不在联合索引的第⼀列时(或者谓词并不在联合索引的第⼀列时), 可以通过
i ndex skip scan来访问索引获得数据。当联合索引第⼀列的唯⼀值很少时,使⽤这种⽅式⽐全表扫描的⽅式效率要⾼。
3、和查询转换相关的
USE_CONCAT:将含有多个OR或者IN运算符所连接起来的查询语句分解为多个单⼀查询语句,并为每个单⼀查询语句选择最优化查询路径,然后再将这些最优化查询路径结
合在⼀起,以实现整体查询语句的最优化⽬的。只有在驱动查询条件中包含OR的时候,才可以使⽤该提⽰。
NO_EXPAND:引导优化器不要为使⽤OR运算符号(或IN运算符)的条件制定相互结合的执⾏计划。正好和USE_CONCAT相反。
REWRITE:当表连接的对象是数据量⽐较⼤的表或者需要获得使⽤统计函数处理过的结果时,为了提⾼执⾏速度可预先创建物化视图。当⽤户要求查询某个查询语句时,优化
器会在从表中和从物化视图中读取数据的两种⽅法中选择⼀个更有效的⽅法来读取数据。该执⾏⽅法称之为查询重写。使⽤REWRITE提⽰引导优化器按照该⽅式执
⾏。
MERGE:为了能以最优⽅式从视图或者嵌套视图中读取数据,通过变换查询语句来直接读取视图使⽤的基表数据,该过程被称之为视图合并。不同的情况其具体使⽤类型也有
所不同。该提⽰主要在视图未发⽣合并时被使⽤。尤其是对⽐较复杂的视图或者嵌套视图(⽐如使⽤了GROUP BY或DISTINC的视图)使⽤该提⽰,有时会取得⾮常好的
效果。
UNNEST:提⽰优化器将⼦查询转换为连接的⽅式。也就是引导优化器合并⼦查询和主查询并且将其向连接类型转换。
NO_UNNEST:引导优化器让⼦查询能够独⽴地执⾏完毕之后再跟外围的查询做FILTER。
PUSH_PRED:使⽤该提⽰可以将视图或嵌套视图以外的查询条件推⼊到视图之内。
NO_PUSH_PRED:使⽤该提⽰确保视图或嵌套视图以外的查询条件不被推⼊到视图内部。
PUSH_SUBQ:使⽤该提⽰引导优化器为不能合并的⼦查询制定执⾏计划。不能合并的⼦查询被优先执⾏之后,该⼦查询的执⾏结果将扮演缩减主查询数据查询范围的提供者
⾓⾊。通常在⽆法执⾏⼦查询合并的情况下,⼦查询扮演的都是检验者⾓⾊,所以⼦查询⼀般被放在最后执⾏。在⽆法被合并的⼦查询拥有较少的结果⾏,或者该⼦
查询可以缩减主查询查询范围的情况下,可以使⽤该提⽰引导优化器最⼤程度地将该⼦查询放在前⾯执⾏,以提⾼执⾏速度。但如果⼦查询执⾏的是远程表或者排序
合并连接的⼀部分连接结果,则该提⽰将不起任何作⽤。
NO_PUSH_SUBQ:使⽤该提⽰将引导优化器将不能实现合并的⼦查询放在最后执⾏。在⼦查询⽆法缩减主查询的查询范围,或者执⾏⼦查询开销较⼤的情况下,将这样的⼦
查询放在最后执⾏可以在某种程度上提⾼整体的执⾏效率。也就是说,尽可能地使⽤其他查询条件最⼤程度地缩减查询范围之后,再执⾏⼦查询。
4、和表连接顺序相关的
这些提⽰可以调整表连接的顺序。调整表连接的顺序并不是只能使⽤这些提⽰,在嵌套循环连接⽅式中也可以让提⽰来引导优化器使⽤由驱动查询条件所创建的索引。然⽽,
该⽅法只有在使⽤的索引和表连接顺序同时被调整的情况下才⽐较有效。⼀般⽽⾔,这些提⽰主要在执⾏多表连接和表之间的连接顺序⽐较混乱的情况下才使⽤,也在排序合并
连接或哈希连接⽅式下,为引导优化器优先执⾏数据量⽐较少得表时使⽤。
LEADING:在⼀个多表关联的查询中,这个Hint指定由哪个表作为驱动表,即告诉优化器⾸先要访问那个表上的数据。引导优化器使⽤LEADING指定的表作为表连接顺序中的
第⼀个表。该提⽰既与FROM中所描述的表的顺序⽆关,也与作为调整表连接顺序的ORDERED提⽰不同,并且在使⽤该提⽰时并不需要调整FROM中所描述的表的顺
序。当该提⽰与ORDERED提⽰同时使⽤时,该提⽰被忽略。
这个提⽰类似ORDERED提⽰,它允许指定驱动查询的表,然后由优化器来判断下⼀个要访问的表。如果使⽤这个提⽰指定多张表,那么就可以忽略这个提⽰。
ORDERED:引导优化器按照FROM中所描述的表的顺序执⾏连接。如果和LEADING提⽰被⼀起使⽤,则LEADING提⽰将被忽略。由于ORDERED只能调整表连接的顺序并不

本文发布于:2023-06-15 00:09:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1038800.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:查询   优化   数据   语句   连接   引导
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图