oracle usehash用法,Oracle Use_hash(SmalltableA,BigTtable) Table Optmizise | 学步园

/*+ 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 */ 提示强制优化器忽略索引的存在

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值