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)避免取多余列致排序的尺寸太大