Oracle Spatial空间查询条件在where 条件中的执行顺序问题

tossgoon 2014-08-14 02:55:03
说明一下:
需要执行一个查询满足两个条件:条件一是用空间查询 sdo_widthin_distance 进行筛选,条件二是我自定义的函数fun_detect_pt_in_line。在执行查询时,条件一筛选出来的记录为3条,但是通过在pl /sql developer里进行单步执行,发现在用条件二进行筛选时,调用自定义函数的次数远远不止3次。
代码如下:

SELECT COUNT(*)
INTO ptnum
FROM tb_spatial c
WHERE
fun_detect_pt_in_line(x,y) =1
AND
SDO_WITHIN_DISTANCE(c.shape,v_geopolyline,'distance=100,unit=m')='TRUE';

条件一与条件二互换位置也一样。
奇怪的是,代码分成两层之后,还是会出现这个问题
代码如下:

SELECT COUNT(*)
INTO ptnum
FROM
(
SELECT x,y
FROM tb_spatial c
WHERE SDO_WITHIN_DISTANCE(c.shape,v_geopolyline,'distance=100,unit=m')='TRUE'
)
WHERE fun_detect_pt_in_line(x,y) =1;

说明:
通过将条件一由空间函数 SDO_WITHIN_DISTANCE 替换为普通的查询条件如 where id<4;时 单步执行时正常了,调用自定义函数的次数与内层的记录个数一致了。
我想问在利用 oracle spatial的空间函数作为条件查询时,为什么会有“不正常”的举动呢?
...全文
167 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼W 2014-08-14
  • 打赏
  • 举报
回复
1. 是否执行次数越多效率越低,是相对的,也许sdo_within_distance更会拉低效率,看cbo怎么认定 3. 在cbo下没有办法 建议让系统自己来判断,如果参数'distance=100,unit=m'是固定的,可以建个函数索引SDO_WITHIN_DISTANCE(c.shape,v_geopolyline,'distance=100,unit=m')
bw555 2014-08-14
  • 打赏
  • 举报
回复
楼主百度下Oracle Hint,也许有你想要的答案
tossgoon 2014-08-14
  • 打赏
  • 举报
回复
引用 2 楼 wildwave 的回复:
这里有个逻辑问题,fun_detect_pt_in_line函数是用来条件中,而不是用在结果中,调用次数和查询结果记录数没有必然联系 当使用id<4,cbo执行的时候先走id的条件,再走fun_detect_pt_in_line条件,而后者并没有过滤作用,执行次数和结果数才会一样 为什么要关心fun_detect_pt_in_line的执行次数呢
你好,我还是刚接触oracle不久。 1、fun_detect_pt_in_line的执行次数跟效率有关系吗?不是执行次数越多效率越低么。 2、我后来改成分开执行了,就是先利用cursor把所有满足SDO_WITHIN_DISTANCE的记录都找出来,筛选一大部分,然后再利用LOOP循环用条件二fun_detect_pt_in_line来进行第二次筛选,就是不把这两个条件放在一个语句里完成,感觉比原来会快一些。 3、cbo我还不太懂,先走id是因为有索引么,我如何让oracle按我的“意愿顺序”执行呢,不让它自动按它的顺序行吗? 针对我这种情况,你能给一个好点的建议吗,就是让他执行的快一点。还是说写在一个语句跟分开写没啥关系呢? 谢谢!
小灰狼W 2014-08-14
  • 打赏
  • 举报
回复
这里有个逻辑问题,fun_detect_pt_in_line函数是用来条件中,而不是用在结果中,调用次数和查询结果记录数没有必然联系 当使用id<4,cbo执行的时候先走id的条件,再走fun_detect_pt_in_line条件,而后者并没有过滤作用,执行次数和结果数才会一样 为什么要关心fun_detect_pt_in_line的执行次数呢
bw555 2014-08-14
  • 打赏
  • 举报
回复
查看执行计划,看看他具体的执行过程吧 我感觉应该是oracle自动对你的语句进行优化,结果优化后还不如不优化呢,呵呵

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧