oracle优化之表连接方式

1、表连接类型:

  Nested Loops Join

  Hash Join

  Merge Sort Join

2、表连接的知识点:

  表访问次数、表驱动顺序,是否排序,使用限制。

  Nested Loops Join:驱动表被访问0次或1次,被驱动表访问0次或N次,N由驱动表返回的结果集的条数来定。

            与驱动顺序有关

             无排序

             无使用限制

  Hash Join    :访问次数:1次或0次

            与驱动顺序有关

             无排序(耗内存)

             不支持 >   <   like   <>  等  

  Merge Sort Join  :访问次数:1次或0次

            与驱动顺序无关

             有排序

             支持 >   <  ,但不支持 like   <>  等

3、 访问次数

create table m1 (
id number not null,
n number,
content varchar(4000)
)

create table m2 (
id number not null,
t1_id number not null,
n number,
content varchar(4000)
)

insert into m1
select rownum,rownum,dbms_random.string('a',50)
from dual connect by level <=100
order by dbms_random.random;

insert into m2
select rownum,rownum,rownum,dbms_random.string('a',50)
from dual connect by level <=100000
order by dbms_random.random;

select *  from m1,m2 where m1.id=m2.t1_id;
select /*+ gather_plan_statistics */  *  from m1,m2 where m1.id=m2.t1_id;
select /*+ leading(m1) use_nl(m2)*/   *  from m1,m2 where m1.id=m2.t1_id;
select /*+ leading(m1) use_nl(m2)*/ *  from m1,m2 where m1.id=m2.t1_id and m1.n in('2','18',30);

select /*+ leading(m1) use_hash(m2) */ * from m1,m2 where m1.id=m2.t1_id

 4、Nested Loops Join 优化

  1)确保在OLTO场景:在大量访问,且每个访问的最终返回的记录很少的场景。

  2)驱动表的限制条件要考虑建立索引:
      select /*+ leading(m1) use_nl(m2)*/ * from m1,m2 where m1.id=m2.t1_id and m1.n in('2','18',30);

      可以建m1表的字段n为索引段,建m2表的字段t1_id为索引段

  3)确保小结果集先驱动,大的被驱动。

  4)统计信息收集不准确引发性能瓶颈,预估返回1条,实际返回477k条,预估不准确导致使用NL连接。

    

 5、Hash Join优化

  1)确保用在全扫描的OLAP场景:最终返回的结果记录比较多

  2)明确连接条件是否限制了Hash Join

  3)两表无任何索引倾向Hash Join

     4)两表限制条件有索引(看返回量)

 5、Merge Sort Join优化

  1)确保用在全扫描的OLAP场景:最终返回的结果记录比较多

  2)明确连接条件是否限制了Hash Join。支持 >   <  ,但不支持 like   <>  等

  3)两表限制条件有索引(看返回量)

  4)避免取多余列致排序的尺寸太大

  

原文地址:https://www.cnblogs.com/yaohuiqin/p/11678172.html