1.引出问题
我把Filter下面有两个结果集的查询成为Filter连接,虽然不严谨,但是为了好说明,在本博客后面,我们都叫做Filter连接。其实这个Filter连接和单表那种Filter一样,只不过是用驱动表的记录去筛选被驱动表的记录。
关于这种Filter,网上说算法类似嵌套循环,但是Filter会维护一个内存表,当驱动表扫描数据时,先在内存表里检索是否有相同的记录,如果有,直接在内存表取出缓存的记录,如果没有,再去被驱动表过滤出数据。
这么看,Filter的算法貌似优越于嵌套循环,但是为什么一般消除Filter呢?为什么Filter要缓存数据,而嵌套循环不去缓存呢?我们慢慢解读。
2.环境准备
drop table test1;
create table test1 as select * from dba_objects where owner='SCOTT';
insert into test1 select * from test1;
insert into test1 select * from test1;
drop table test2 ;
create table test2 as select rownum as rn, o.* from dba_objects o;
create index ix_test2_id on test2(object_id);
create index ix_test2_rn on test2(rn);
drop table test3 ;
create table test3 as select * from dba_objects;
create index ix_test3_id on test3(object_id);
commit;
3.Filter连接的几种写法