sql语句
       select * from studenttemp stttt where exists (select 1 from student s where s.='90')
执行计划
        0      SELECT STATEMENT Optimizer=CHOOSE
        1    0   FILTER
        2    1     TABLE ACCESS (FULL) OF 'STUDENTTEMP'
        3    1     TABLE ACCESS (FULL) OF 'STUDENT'我想问一下,这个filter是怎样过滤STUDENTTEMP和STUDENT这两张表,是不是有点像nested loops样做循环嵌套,从STUDENTTEMP取出一条记录,然后去STUDENT中匹配,匹配成功就把记录留下来,不成功的就过滤掉,然后再从STUDENTTEMP取出下一条记录,直到结束
另外查看oracle的执行计划时,好像能用filter的地方也能用nested loops,请问下它们在效率上有什么区别,oracle主要是根据什么来选择是用filter还是nested loops小弟正在学oracle的调优,希望能得到大家的指点,先在此谢过了

解决方案 »

  1.   

    理解的基本正确。
    如果父表和子表有关联关系就会使用nested loop,
    没有关联关系就使用filter了.
    效率情况要根据表的实际情况分析。不能一概而论。filter的形式改成如下后效率更高:
    select * from studenttemp stttt where exists (select null from student s where s.='90' where rownum=1) 
      

  2.   

    也就是说用IN EXISTS之类的就会用FILTER
    如果用=之类的就会用nested loop这个我倒是没研究过
    只看过HASH和nested loop的差别