データの座標系は?そして、最も重要なのは、許容値あなたのメタデータに何を設定しましたか?
いくつかの他のコメント:
1)は、バッファ・アプローチと関係を使用しないでください。ちょうど距離内のアプローチを使用してください。
2)あなたは、単純なCTAS使用したクエリの並べ替えのためのPL/SQLループを必要としない:2 cm以内にある点AとBの書かれた、カップルのよう
create table orahancrosses as
select c1.mip mip_1, c1.startmi startmi_1, c2.mip mip_2, c2.startmi startmi_2
from orahan c1, orahan c2
where sdo_wihin_distance (c2.geoloc, c1.geoloc, 'distance=2 unit=cm') = 'TRUE'
and c2.mi_prinx <> c1.mi_prinx;
3) (A、B)、もう一度(B、A)として2回返されます。このように、SDO_JOIN技術を使用して、より良い実行する必要があります)
create table orahancrosses as
select c1.mip mip_1, c1.startmi startmi_1, c2.mip mip_2, c2.startmi startmi_2
from orahan c1, orahan c2
where sdo_wihin_distance (c2.geoloc, c1.geoloc, 'distance=2 unit=cm') = 'TRUE'
and c1.rowid < c2.rowid;
3)あなたが言及するポイント数(400000+の処理:これを避ける(とのみ例1を返す)するには、このようなクエリを記述:
これはおそらく、データベースサーバーの容量に応じて処理に時間がかかります。 Oracle Enterprise Editionのライセンスで、ハードウェアに適切な容量(コア数)がある場合、並列処理によって経過時間が短縮されます。
4)Oracle 11gを使用しているとします。正確なバージョンは?バージョン11.2.0.4は11gR2の端末リリースです。古いものはサポートされなくなりました。これで実際に12cR1(12.1.0.2)にいるはずです。 12.1.0の大きなメリット。多くの空間関数と演算子を高速化するVector Performance Accelerator機能(Oracle Spatialの適切なライセンスを所有している場合のみ - 無料のOracle Locator機能では使用できません)。 2つの点を使用
======================================
あなたの例では。
select sdo_geom.sdo_distance(
sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),
sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.07336716,null),null,null),
0.005
) distance
from dual;
DISTANCE
----------
.01000197
1 row selected.
注意SRIDは指定しません。座標がメートルで表されていると仮定すると、それらの間の距離は実際には1cmを少し超えています。なぜあなた
======================================
理由元の構文は、SDO_BUFFER()呼び出しで指定した許容誤差のために気づいたように動作しません。 0.5(= 50cm)とし、半径0.02(2cm)のバッファーを作成します。効果は、生成されたバッファが効果的にポイント自体に溶け込むことです。許容値0.5で例えば
:
select sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.5) from dual;
が生成されます
SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(521554.782, 4230983.08, NULL), NULL, NULL)
寛容0.005で:
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2), SDO_ORDINATE_ARRAY(521554.782, 4230983.06, 521554.802, 4230983.08, 521554.782, 4230983.1, 521554.762, 4230983.08, 521554.782, 4230983.06))
:
select sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.005) from dual;
あなたは適切なバッファを取得します
と非常に近い点は、今、そのバッファと一致:
select sdo_geom.relate(
sdo_geom.sdo_buffer(sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.08336913,null),null,null),0.02,0.005),
'determine',
sdo_geometry (2001,null,sdo_point_type(521554.782174622,4230983.07336716,null),null,null),
0.005
) relation
from dual;
RELATION
-------------------------
CONTAINS
1 row selected.
============================= =========
あなたのデータが適切な明示的なSRIDを持っていないという事実は、測定や距離に基づく検索で明示的な単位を使用することができないことを意味します。データベースは、あなたのデータがどの座標系であるかを知らないので、2つの点がcmまたはm離れた数よりも小さいかどうかを判断する方法を知らない。座標はメートルであると仮定します。私は上記の例で与えるので
、私はいくつかのプロジェクトでのOracle 11gR2のを使用して、会社の仕事だ'DISTANCE=0.02'
で
'DISTANCE=2 UNIT=CM'
を交換してください。 Orahanには約400,000レコード(行)があります。私は自分の質問をできるだけ編集し、メタデータに許容値を追加します。 –会社が11gR2を使用し、適切なシステム管理者とDBAを持っている場合は、すでに11.2.0.4にある可能性があります。それでも、そのバージョンと処理する必要があるデータの量では、SDO_JOINのアプローチは間違いなく(私の返事に構文を追加した)方法です。 Vector Performance Accelerator機能では、12cでは異なるでしょう。 –
私はSDO_JOINメソッドと言っていることを試しています、それは非常に高速です。それは2分で仕事をしています。ありがとうございました。しかし、まだ問題は残っている。いくつかのポイントの間に1cmの距離がありますが、交差点は見つかりません。私の列のdiminfoが間違っていると思います。 –