同志们好,表的比较有hash,loop,merge三中,在oracle表查询时如何使用这三种比较呢

解决方案 »

  1.   

    一般来说,系统会自动选择哪种方式的,现在用的ORACLE基本上都是用CBO
    你也可以用HINT来指定
    22. /*+USE_NL(TABLE)*/
      将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.
      例如:
      SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
      23. /*+USE_MERGE(TABLE)*/
      将指定的表与其他行源通过合并排序连接方式连接起来.
      例如:
      SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
      24. /*+USE_HASH(TABLE)*/
      将指定的表与其他行源通过哈希连接方式连接起来.
      例如:
      SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
      

  2.   

    use_merge(tableName ...) --将提示的表以排序合并连接的方式连接到结果集。即先在每个表中查询所有符合条件的记录并排序,然后合并各个表,适用于大吞吐量。尤其适合大表存在cola>常数的情况。
    use_nl(tableName ...) --嵌套循环连接方式,适用快速返回第一行和返回很小的结果集。首先根据其它表上的结果查找这个表上的第一个匹配的行
    use_hash(tableName...) --类似于use_nl方式,但区别是,use_hash会把被遍历(指定)的表放在内存中,所以需要有足够内存,且hash_area_size或者pga_aggregate_target要设置的足够大,否则将导致操作在磁盘上进行,影响性能。可以为较大的结果集提供最佳响应时间。因为它找到匹配行后就返回,不会象use_merge那样等到找到所有行才返回。有时优化器会改写use_hash提示为use_nl