使用inside in语句时,如果不使用索引,则无法评估SDO_NN

时间:2013-03-28 01:41:55

标签: oracle11g oracle-spatial

如果我运行以下查询:

select B3.bid as id ,B3.bshape as shape 
from Buildings B3 
where B3.bid in 
(
   select distinct B1.bid from Buildings B1, 
   (
     select * from Buildings B where B.bname in (select BOF.bname from Buildings_On_Fire BOF)
   ) B2 where sdo_nn(B1.bshape, B2.bshape, 'distance=100') = 'TRUE' and B1.bname != b2.bname
)



我收到以下错误:

  

第1行的错误:ORA-13249:如果没有,则无法评估SDO_NN   使用索引
ORA-06512:在“MDSYS.MD”,第1723行ORA-06512:at   “MDSYS.MDERR”,第17行
ORA-06512:在“MDSYS.PRVT_IDX”,第9行


但是,如果只运行以下子查询:

select distinct B1.bid from Buildings B1, 
(
   select * from Buildings B  where B.bname in (select BOF.bname from Buildings_On_Fire BOF)
) B2 where sdo_nn(B1.bshape, B2.bshape, 'distance=100') = 'TRUE' and B1.bname != b2.bname


执行得很好。我已经验证了空间索引,它们似乎是有效的 我是oracle的新手,不知道下一步该做什么。请帮忙。

如果有解决方案不需要更改上述查询,那将是最好的。

1 个答案:

答案 0 :(得分:1)

答案有点迟,但是来了......

您得到的错误是因为优化器没有使用空间索引来解决SDO_NN运算符。与其他空间运算符(SDO_RELATE,SDO_WIHIN_DISTANCE)相反,如果没有索引的帮助,无法解析SDO_NN。

然后我再次怀疑你的查询是不正确的。如果我理解正确的话,你想要做的就是从所有着火的建筑物中找到所有距离100(什么?米?)的建筑物。为此,请使用SDO_WITHIN_DISTANCE运算符。

我们假设你的表是这样的:

建筑物(出价编号,bname varchar2(30),bshape sdo_geometry)

buildings_on_fire(出价编号,bname varchar2(30))

选择将如下:

select b1.bid as id, b1.bshape as shape
from   buildings b1, 
       buildings b2, 
       buildings_on_fire bof
where  b2.bname = bof.bname
and    b1.bname <> b2.bname
and    sdo_within_distance (
         b1.bshape, b2.bshape, 
         'distance=100 unit=meter'
       ) = 'TRUE';