Oracle Spatial空间查询条件在where 条件中的执行顺序有关问题
Oracle Spatial空间查询条件在where 条件中的执行顺序问题
说明一下:
需要执行一个查询满足两个条件:条件一是用空间查询 sdo_widthin_distance 进行筛选,条件二是我自定义的函数fun_detect_pt_in_line。在执行查询时,条件一筛选出来的记录为3条,但是通过在pl /sql developer里进行单步执行,发现在用条件二进行筛选时,调用自定义函数的次数远远不止3次。
代码如下:
条件一与条件二互换位置也一样。
奇怪的是,代码分成两层之后,还是会出现这个问题
代码如下:
说明:
通过将条件一由空间函数 SDO_WITHIN_DISTANCE 替换为普通的查询条件如 where id<4;时 单步执行时正常了,调用自定义函数的次数与内层的记录个数一致了。
我想问在利用 oracle spatial的空间函数作为条件查询时,为什么会有“不正常”的举动呢?
------解决思路----------------------
查看执行计划,看看他具体的执行过程吧
我感觉应该是oracle自动对你的语句进行优化,结果优化后还不如不优化呢,呵呵
------解决思路----------------------
这里有个逻辑问题,fun_detect_pt_in_line函数是用来条件中,而不是用在结果中,调用次数和查询结果记录数没有必然联系
当使用id<4,cbo执行的时候先走id的条件,再走fun_detect_pt_in_line条件,而后者并没有过滤作用,执行次数和结果数才会一样
为什么要关心fun_detect_pt_in_line的执行次数呢
------解决思路----------------------
楼主百度下Oracle Hint,也许有你想要的答案
------解决思路----------------------
1. 是否执行次数越多效率越低,是相对的,也许sdo_within_distance更会拉低效率,看cbo怎么认定
3. 在cbo下没有办法
建议让系统自己来判断,如果参数'distance=100,unit=m'是固定的,可以建个函数索引SDO_WITHIN_DISTANCE(c.shape,v_geopolyline,'distance=100,unit=m')
说明一下:
需要执行一个查询满足两个条件:条件一是用空间查询 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的空间函数作为条件查询时,为什么会有“不正常”的举动呢?
------解决思路----------------------
查看执行计划,看看他具体的执行过程吧
我感觉应该是oracle自动对你的语句进行优化,结果优化后还不如不优化呢,呵呵
------解决思路----------------------
这里有个逻辑问题,fun_detect_pt_in_line函数是用来条件中,而不是用在结果中,调用次数和查询结果记录数没有必然联系
当使用id<4,cbo执行的时候先走id的条件,再走fun_detect_pt_in_line条件,而后者并没有过滤作用,执行次数和结果数才会一样
为什么要关心fun_detect_pt_in_line的执行次数呢
------解决思路----------------------
楼主百度下Oracle Hint,也许有你想要的答案
------解决思路----------------------
1. 是否执行次数越多效率越低,是相对的,也许sdo_within_distance更会拉低效率,看cbo怎么认定
3. 在cbo下没有办法
建议让系统自己来判断,如果参数'distance=100,unit=m'是固定的,可以建个函数索引SDO_WITHIN_DISTANCE(c.shape,v_geopolyline,'distance=100,unit=m')