use_hash

/*+ 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值