查看执行计划,看看他具体的执行过程吧
我感觉应该是oracle自动对你的语句进行优化,结果优化后还不如不优化呢,呵呵

解决方案 »

  1.   

    这里有个逻辑问题,fun_detect_pt_in_line函数是用来条件中,而不是用在结果中,调用次数和查询结果记录数没有必然联系当使用id<4,cbo执行的时候先走id的条件,再走fun_detect_pt_in_line条件,而后者并没有过滤作用,执行次数和结果数才会一样为什么要关心fun_detect_pt_in_line的执行次数呢
      

  2.   

    你好,我还是刚接触oracle不久。
    1、fun_detect_pt_in_line的执行次数跟效率有关系吗?不是执行次数越多效率越低么。
    2、我后来改成分开执行了,就是先利用cursor把所有满足SDO_WITHIN_DISTANCE的记录都找出来,筛选一大部分,然后再利用LOOP循环用条件二fun_detect_pt_in_line来进行第二次筛选,就是不把这两个条件放在一个语句里完成,感觉比原来会快一些。
    3、cbo我还不太懂,先走id是因为有索引么,我如何让oracle按我的“意愿顺序”执行呢,不让它自动按它的顺序行吗?
    针对我这种情况,你能给一个好点的建议吗,就是让他执行的快一点。还是说写在一个语句跟分开写没啥关系呢?
    谢谢!
      

  3.   

    楼主百度下Oracle Hint,也许有你想要的答案
      

  4.   

    1. 是否执行次数越多效率越低,是相对的,也许sdo_within_distance更会拉低效率,看cbo怎么认定
    3. 在cbo下没有办法建议让系统自己来判断,如果参数'distance=100,unit=m'是固定的,可以建个函数索引SDO_WITHIN_DISTANCE(c.shape,v_geopolyline,'distance=100,unit=m')