3

次のクエリを実行すると:

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
: "MDSYS.MDERR"、行 17
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


これはうまく実行されました。空間インデックスを確認しましたが、有効なようです。
私はオラクルが初めてで、次に何をすべきかわかりません。助けてください。

上記のクエリを変更する必要のない解決策がある場合は、それが最適です。

4

1 に答える 1

1

回答が少し遅くなりましたが、ここに来ます...

表示されるエラーは、オプティマイザが空間インデックスを使用して SDO_NN 演算子を解決しなかったために発生します。他の空間演算子 (SDO_RELATE、SDO_WIHIN_DISTANCE) とは対照的に、SDO_NN はインデックスを使用しないと解決できません。

次に、クエリの定式化が間違っていると思われます。私の理解が正しければ、あなたがしたいことは、燃えている建物から 100 (何メートル?) 以内にあるすべての建物を見つけることです。そのためには、SDO_WITHIN_DISTANCE 演算子を使用します。

テーブルが次のようになっているとします。

建物 (入札番号、bname varchar2(30)、bshape sdo_geometry)

building_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';
于 2013-10-18T14:33:01.417 に答える