SELECT   ,        
         job_id
    FROM (SELECT c.re ,              
                 j.job_id job_id
            FROM tt_job j,
                 tt_chem c
           WHERE j.mat_id = c.mat_id
                 and c.mat_id='T234320') p
where f_is_available_job(p.job_id)=1现在我可以确定的是..内层查询P返回内容只有2行.
我觉得外层查询的这个函数应该只对这2行作过滤吧..
但是实际上ORACEL把外层的这个查询做了全表扫描...
我的记录是这个函数执行了大概2W多次.
很奇怪...为什么会这样子呢..能不能强迫外层查询的WHERE语句直接使用内层结果呢执行计划如下:
SELECT STATEMENT  ALL_ROWSCost: 730  Bytes: 64  Cardinality: 1   12 HASH JOIN  Cost: 730  Bytes: 64  Cardinality: 1   10 VIEW DATA01. 
11 TABLE ACCESS FULL TABLE DATA01.TT_JOB Cost: 726  Bytes: 73,085  Cardinality: 1,555   为什么他把外层的函数与内层的连接合并到了一起..搞成了一个HASH JOIN..
能不能强迫他不这么干呢

解决方案 »

  1.   

    表和索引什么做的分析?另外.如果你不想用hash join. 可以使用hint.当然,要搞清楚为什么慢.用event 10053来trace一下看看.
      

  2.   

    TO 楼上..我查过HINT了..用了一个NO_MERGE..但是没效果他还是走HJ了..我把自己的函数里面加了点东西.知道他对TT_JOB做FULL SCAN的时候 调用了这个...后来我没办法了..直接把最外层的where f_is_available_job(p.job_id)=1写到了 HAVING中去 =.= 郁闷..