Oracle的hint
Hint是Oracle数据库灵活性的体现。由于Hint具有最高的优先级,因此可以通过Hint使优化器根据用户的需要来生成指定的执行计划。
Oracle的hint种类繁多,大致可以分为下面几类:
优化方式和目标:如RULE、CHOOSE、FIRST_ROWS、ALL_ROWS等。
访问路径:如INDEX、FULL、CLUSTER、INDEX_FFS等。
查询转换:如MERGE、USE_CONCAT、NO_EXPAND等。
连接顺序:如ORDERED和STAR。
连接操作:如USE_NL、USE_HASH、USE_MERGE等。
并行执行:如PARALLE、NOPARALLEL、PARALLEL_INDEX等。
其他类型;如APPEND、UNNEST、CACHE等。
使用HINT的两种方式:/*+ HINT */和--+ HINT
一、USE_NL(嵌套循环连接)
在嵌套循环连接中,Oracle从第一个行源中读取第一行,然后和第二个行源中的数据进行对比。所有匹配的记录放在结果集中,然后Oracle将读取第一个行源中的下一行。按这种方式直至第一个数据源中的所在行都经过处理。第一个记录源通常称为外部表,或者驱动表,相应的第二个行源称为内部表。使用嵌套循环连接是一种从连接结果中提取第一批记录的最快速的方法。
在驱动行源表(就是您正在查找的记录)较小、或者内部行源表已连接的列有惟一的索引或高度可选的非惟一索引时, 嵌套循环连接效果是比较理想的。嵌套循环连接比其他连接方法有优势,它可以快速地从结果集中提取第一批记录,而不用等待整个结果集完全确定下来。这样,在理想情况下,终端用户就可以通过查询屏幕查看第一批记录,而在同时读取其他记录。不管如何定义连接的条件或者模式,任何两行记录源可以使用嵌套循环连接,所以嵌套循环连接是非常灵活的。
然而,如果内部行源表(读取的第二张表)已连接的列上不包含索引,或者索引不是高度可选时, 嵌套循环连接效率是很低的。如果驱动行源表(从驱动表中提取的记录)非常庞大时,其他的连接方法可能更加有效。
图1-1说明了程序清单1-1中查询执行的方法。
select /*+ordered*/ename,dept.deptno
from dept,emp
where dept.deptno=emp.deptno
二、USE_MERGE(排列合并连接)
在排列合并连接中,Oracle分别将第一个源表、第二个源表按它们各自要连接的列排序,然后将两个已经排序的源表合并。如果找到匹配的数据,就放到结果集中。
在缺乏数据的选择性或者可用的索引时,或者两个源表都过于庞大(超过记录数的5%)时,排序合并连接将比嵌套循环连更加高效。但是,排列合并连接只能用于等价连接(WHERE D.deptno=E.dejptno,而不是WHERE D.deptno>=E.deptno)。排列合并连接需要临时的内存块,以用于排序(如果SORT_AREA_SIZE设置得太小的话)。这将导致在临时表空间占用更多的内存和磁盘I/O。
图1-2解释了程序清单1-2查询执行的方法。
select /*+ordered*/ename,dept.deptno
from emp,dept
where dept.deptno=emp.deptno
三、USE_HASH(哈希连接)
当内存能够提供足够的空间时,哈希(HASH)连接是Oracle优化器通常的选择。在哈希连接中,Oracle访问一张表(通常是较大的表),并在内存中建立一张基于连接键的哈希表。然后它扫描连接中其他的表(通常是较大的表),并根据哈希表检测是否有匹配的记录。
只有在数据库初始化参数HASH_JOIN_ENABLED设为True,并且为参数PGA_AGGREGATE_TARGET设置了一个足够大的值的时候,Oracle才会使用哈希边连接(HASH_AREA_SIZE是向下兼容的参数,但在Oracle9i之前的版本中应当使用HASH_AREA_SIZE)。这和嵌套循环连接有点类似——Oracle先建立一张哈希表以利于操作进行。当使用ORDERED提示时,FROM子句中的第一张表将用于建立哈希表。
当缺少有用的索引时,哈希连接比嵌套循环连接更加有效。哈希连接可能比排序合并连接更快,因为在这种情况下只有一张源表需要排序。哈希连接也可能比嵌套循环连接更快,因为处理内存中的哈希表比检索B_树索引更加迅速。和排序合并连接、群集连接一样,哈希连接只能用于等价连接。和排序合并连接一样,哈希连接使用内存资源,并且当用于排序内存不足时,会增加临时表空间的I/O(这将使这种连接方法速度变得极慢)。最后,只有基于代价的优化器才可以使用哈希连接。
图1-3解释了执行程序清单1-3查询的方法。
select /*+ordered*/ename,dept.deptno
from emp,dept
where dept.deptno=emp.deptno
Oracle的hint相关推荐
- day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法
在SQL语句优化过程中,经常会用到hint, 以下是在SQL优化过程中常见Oracle中"HINT"的30个用法 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方 ...
- oracle 设置忽略关键字,Oracle中Hint被忽略的几种常见情形
Hint可以影响优化器对于执行计划的选择,但这种影响不是强制性的,优化器在某些情况下可能会忽略目标SQL中的Hint.由于各种原因导致Hint被Oracle忽略后,Oracle并不会给出任何提示或者警 ...
- Oracle中Hint深入理解(原创)
http://czmmiao.iteye.com/blog/1478465 Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明 ...
- ORACLE选择hint,ORACLE中的的HINT详解
hints是oracle提供的一种机制,用来告诉优化器按照我们的告诉它的方式生成执行计划.我们可以用hints来实现: 1) 使用的优化器的类型 2) 基于代价的优化器的优化目标,是all_rows还 ...
- oracle hint禁用索引,【轉】Oracle索引HINT的使用
在SQL的查詢過程中,索引是快速查詢數據的方法之一,是最重要.最常見的手段,這篇文章將討論和索引相關的HINT的使用. 1.HINT的使用方法: select /*+ INDEX (tab pk_ta ...
- oracle parallel_index hint在非分区表的生效
之前没特别注意,在有些场景下希望使用并行索引扫描的时候,发现parallel_index hint并没有生效,于是抽空看了下文档:The PARALLEL_INDEX hint instructs t ...
- oracle中hint 详解
Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...
- ORACLE的HINT详解
Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...
- oracle opaque_transform,hint OPAQUE_TRANSFORM产生的原因
在AWR报告中经常看到一个hint /*+ OPAQUE_TRANSFORM */,感到莫名其妙.原因是什么引起的呢?如果在数据库B的AWR中看到这种hint,原 在AWR报告中经常看到一个hint ...
最新文章
- 每日一皮:这张图送给正在努力改Bug的你
- 用python 爬取百度百科内容-爬虫实战(一) 用Python爬取百度百科
- python爬虫抓收费图片_简单的Python抓taobao图片爬虫
- java9 jar hell,Java Jar hell运行时异常
- java基本语句回文数实验_实验二 java基本数据类型与把持语句.doc
- 湖南大学第十四届ACM程序设计新生杯(重现赛)L-The Digits String (矩阵快速幂)
- 俄罗斯“指尖旋风”席卷南京
- 数据库激荡 40 年,深入解析 PostgreSQL、NewSQL 演进历程
- UE4中多种颜色轮廓线的后期处理
- boost知识点查阅
- iis应用池解决方案
- 如何把空间数据从CGCS2000转换到WGS84和BD09 ——JAVA语言实现
- MATLAB之方程组求解(八)
- als算法参数_ALS算法
- N沟道和P沟道MOS管的四个不同点
- gpasswd命令简介
- 区块链的应用,教你怎样用区块链赚钱
- git 解决push报错:[rejected] master -> master (fetch first)
- ABB机器人基础培训资料整理与总结
- [蓝桥杯国赛]客观题