/*+ USE_HASH(TABLE) */ use_hash提示对指定的标志性一个散列连接。
将指定的表与其他行源通过哈希连接方式连接起来.
从本质上讲,散列连接是Oracle用以驱动表(最小的表,where 子句中的第一个表)向RAM区中装载纪录
的方法,RAM区是由hash_area_size初始化参数定义的。
然后,Oracle使用散列的方法定位第二小的表中的纪录。在两个表都非常大的情况下,散列连接通常
与并行查询结合使用。
例如:
SELECT /*+ USE_HASH(TA,TB) parallel(TA,4) parallel(TB,4) */
FROM BSEMPMS TA,
BSDPTMS TB
WHERE TA.DPT_NO=TB.DPT_NO;
分析:
装入小表(BSEMPMS)到RAM,使用RAM中的行ID进行散列访问大表(BSDPTMS)。
说明:
散列连接通常快于嵌套循环连接,特别是在驱动表已经在查询的where子句中过滤,只剩下少量记录的
情况。
前提:
A、检查初始化参数
确保正确设置optimozer_index_cost_adj、hash_multiblock_io_count、optimozer_max_permutations
和hash_area_size参数。
B、检察驱动表
确保最小的表作为驱动表(from子句中的第一个表).这是因为散列连接使用驱动表创建内存数组。
C、分析CBO统计资料
确保对表和(或)连接表字段的统计资料进行过正确的分析。
D、检察分布不均匀的字段
推荐仅对不均匀的分配使用字段矩形图。
E、检察RAM区
确保hash_area_size大到可以容纳内存中较小的表。否则,Oracle必然会将写入temp表空间,降低
散列连接的速度。
/*+ USE_MERGE(TABLE) */ 将指定的表与其他行源通过合并排序连接方式连接起来
use_merge提示强制执行—个排序合并操作。排序合并操作通常与并行查询结合使用,因为排序合并连接对
表执行全表扫描。排序合并连接最适用于生成大型结果集的查询.
例如日常报表和表细节总结查询,或用来处理不使用连接主键索引的表。
例如:
SELECT /*+ USE_MERGE(BSEMPMS,BSDPTMS) */
FROM BSEMPMS,
BSDPTMS
WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
注意:
排序合并连接并不使用索引来连接这些表。在大多数情况下,索引访问会更快。但是排序合并连接
可能最适合于不使用where子句的大连接表,或表中无索引的查询。
/*+ USE_NL(TABLE) */将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.
强制对目标表执行嵌套循环连接。与其他方式的连接提示不同,use_nl提示只需驱动表的名称(使用CBO时,
from子句的第一个表)。嵌套循环连接是最古老的连接方式,它几乎总是基于规则的优化方式(也就是RULE
提示)共同使用。
例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/
BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM
FROM BSEMPMS,
BSDPTMS
WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
/*+ START */ 强制使用星型查询计划
前提是查询中存在至少三个表,而且在事实表中存在恰当的索引。Star提示比传统的连接方式快得多,传统
的连接方式首先将最小的引用表与事实表连接,再将其他的引用表与中间生成表连接。
前提:
A、必须存在连接在一起的至少三个表,其中有——个大的事实表和几个小维表。
B、在事实表的字段上必须存在一个索引,这些字段将是每个表的连接主键。从Oracle8i开始,你需要
使用位图索引,而不是连接在一起的索引。
C、你必须检验执行计划,以确保在执行连接时使用嵌套循环操作。
原理:
1、将维表装入内存
2、将事实表使用连锁索引连接
3、产生查询结果
/*+ MERGE_AJ */ 放到NOT IN 子查询中反向连接
在使用全表访问比索引访问更好的情况下,我们可以在not in子查询中使用merge_aj提示,以方便于执行
反向连接。
警告:
只有在not in 子句中要求的字段有非空限制的时候,反连接提示merge_ah和hash_aj才起作用。
例如:
select dname
from dept
where deptno not in (select /*+ merge_aj */ deptno
from emp
where job='SALESMAN');
/*+ HASH_AJ */ 放到NOT IN 子查询中进行散列反向连接
/*+ INDEX_JOIN(TABLE INDEX_NAME) */ 提示明确命令优化器使用索引作为访问路径.
例如:
SELECT /*INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/
Sal,
Hiredate
FROM Bsempms
WHERE Sal < 60000;
/*+ ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,... */将几个单列索引的扫描合起来.
如果表拥有非惟一的单独字段索引,而且你期望使用多个索引服务于该查询,那么可以使用and_equal
提示。它将合并这些索引,并使这些单独索引操作时就象耽搁连锁索引一样。
前提:
需要指定表名和至少两个索引名,但是索引名不能操作5个。
例如:
SELECT /*+ INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX) */
FROM Bsempms
WHERE Emp_No = 'SCOTT'
AND Dpt_No = 'TDC306';
/*+ no_index */ 提示强制优化器忽略索引的存在
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dinanzhang/archive/2008/03/26/2221288.aspx
分享到:
相关推荐
介绍了oracle中的hint,常用的 ordered、use_nl、use_hash、index、full 五种, 给出使用实例和适用场景
#match_hash_in_cmake_cache "OCV_DOWNLOAD_ADE_HASH_3rdparty_ade_v0_1_2d_zip" #match_hash_in_cmake_cache "OCV_DOWNLOAD_FFMPEG_HASH_3rdparty_ffmpeg_opencv_videoio_ffmpeg_dll" #do_copy "opencv_videoio_...
在进行Oracle数据库SQL语句优化时,使用Hint是一个重要的手段,通过在SQL语句中添加特定的注释指令来引导优化器选择最优的执行计划。以下是一些Oracle Hint的用法和相关知识点: 1. /*+ALL_ROWS*/:此Hint旨在优化...
在优化SQL查询时,主要涉及三种连接方法:嵌套循环连接(USE_NL)、排列合并连接(USE_MERGE)和哈希连接(USE_HASH)。以下是对这些连接方式的详细说明: 1. **嵌套循环连接(USE_NL)** - 在嵌套循环连接中,...
- HASH_AJ:强制使用哈希关联。 - MERGE_AJ:强制使用排序合并关联。 - USE_HASH/NO_USE_HASH:指示是否使用哈希关联。 - USE_MERGE/NO_USE_MERGE:指示是否使用排序合并关联。 - LEADING:指定join操作的主表。 - ...
Oracle性能优化是数据库管理员和开发人员关注的重要领域,特别是在处理大量数据和复杂查询时。本文将深入探讨Oracle性能优化文档中的关键知识点,帮助你更好地理解和应用这些技术。 首先,我们来了解一下Oracle性能...
6.4.1 use_hash,use_nl和use_merge hint 127 6.4.2 no_use_hash hint 132 6.4.3 no_use_merge hint 133 6.4.4 no_use_nl hint 133 6.5 并行执行相关的hint 134 6.5.1 parallel hint 134 6.5.2 no_parallel hint 134...
6.4.1 use_hash,use_nl和use_merge hint 127 6.4.2 no_use_hash hint 132 6.4.3 no_use_merge hint 133 6.4.4 no_use_nl hint 133 6.5 并行执行相关的hint 134 6.5.1 parallel hint 134 6.5.2 no_parallel hint 134...
8. **USE_HASH**: 这个指令用于指定使用哈希连接(hash join)来处理特定的表。哈希连接通常在处理大型表且内存资源充足时能提供较高的性能。 9. **AVOID_NL**: 如果指定,优化器在进行外连接操作时将不会使用嵌套...
在大表连接且连接键分布均匀的场景下,哈希连接通常比其他连接方法更快,因此在适当情况下使用`USE_HASH`提示可以优化查询性能。 ### DUAL表问题 DUAL表是Oracle中一个特殊的单行表,常用于执行计算或返回固定值。...
- `NO_USE_HASH`:指示不使用哈希连接。 - `USE_MERGE`:指示使用合并连接。 - `NO_USE_MERGE`:指示不使用合并连接。 - `USE_NL`:指示使用嵌套循环连接。 - `NO_USE_NL`:指示不使用嵌套循环连接。 4. **...
- **NL_AJ**、**HASH_AJ**、**MERGE_AJ**:分别指定嵌套循环、哈希和合并连接方式。 - **USE_HASH**、**USE_MERGE**、**USE_NL**:分别指定使用哈希、合并或嵌套循环连接。 - **NO_USE_HASH**、**NO_USE_MERGE**、**...
7. **USE_NL, USE_MJ, USE_HASH**:这些Hint强制优化器使用特定的连接方法,如嵌套循环、合并连接或哈希连接。 8. ** Materialized View Hint**:在查询中使用此Hint可以强制优化器使用物化视图,从而提升查询性能...
在SQL Server中,虽然没有直接提供函数索引或哈希索引的功能,但可以通过一些技巧间接实现类似的效果,以优化查询性能。以下两种方法分别针对不同的场景提供了解决方案。 1. **计算列上建立索引,实现“函数索引”...
8. `no_use_hash`:此hint排除了哈希连接的可能性,使得CBO只能考虑其他类型的连接方法。 9. `no_index_ffs`和`no_index_ss`:这两个hint分别用于禁用快速全索引扫描和跳过扫描,避免特定索引的这些扫描操作。 10....
- `USE_HASH` HINT:强制使用哈希连接,适用于大表之间的连接,特别是当两个表都较大且可以完全放入内存时。 - `ORDERED` HINT:指示CBO保持查询结果的顺序,常与子查询和游标相关联。 - `FIRST_ROWS` HINT:优化...
使用hash join时,HASH_AREA_SIZE初始化参数必须足够大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY为AUTO,然后调整PGA_AGGREGATE_TARGET即可。以下条件下hash join可能有优势:两个...
- HASH_AJ:哈希join。 - MERGE_AJ:排序合并join。 - USE_HASH、NO_USE_HASH等用于开启或禁用特定的join优化方法。 概要数据提示:这类提示用于向优化器提供额外的统计信息。 - OPTIMIZER_FEATURES_ENABLE:指定...
- 确保`HASH_AREA_SIZE`初始化参数足够大,对于Oracle 9i版本,建议使用SQL工作区自动管理。 - 使用`USE_HASH(table_name1 table_name2)`提示来强制使用HASH JOIN。 - 如果表很大无法完全放入内存,优化器会将其分割...
When the deepest layer is forced to use a small number of binary variables (e.g. 32), the graphical model performs “semantic hashing”: Documents are mapped to memory addresses in such a way that...