2017-10-30 1 views
0

Oracleには、空間関係に基づいて結合表を作成するために使用されるSDO_JOINという表関数があります。家はである何近所見つけるためのクエリの例は次のようなものです:Oracleで空間結合を実行する適切な方法は何ですか?

select 
    house.address, 
    neighbourhood.name 
from table(sdo_join('HOUSE', 'GEOMETRY', 'NEIGHBOURHOOD', 'GEOMETRY', 'mask=INSIDE')) a 
inner join house 
    on a.rowid1 = house.rowid 
inner join neighbourhood 
    on a.rowid2 = neighbourhood.rowid; 

しかし、私はちょうど句の上の空間的関係と結合定期的に実行して同じ結果を得る:

select 
    house.address, 
    neighbourhood.name 
from house 
inner join neighbourhood 
    on sdo_inside(house.geometry, neighbourhood.geometry) = 'TRUE'; 

私は、正確に何が起こっているのかを理解するのが簡単だと思うので、2番目の方法が好きですが、これが空間結合を行う適切な方法であるかどうかについてOracleのマニュアルを見つけることができませんでした。

これら2つの方法に違いはありますか?もしあれば、何?存在しない場合、どのスタイルがより一般的ですか?

答えて

0

パフォーマンスに違いがあります。

最初のアプローチ(SDO_JOIN)は、各表のRTREE索引を照合することによって候補を分離します。

第2のアプローチは、NEIGHBORHOODテーブルの各ジオメトリについてHOUSEテーブルを検索します。

テーブルの大きさ、特にNEIGHBORHOODテーブルのサイズ(正確には、クエリが実際に使用するNEIGHBORHOODテーブルの行数)によって異なります。 NEIGHBORHOODテーブルが小さい(1000行未満)場合、2番目の方法は良好です(HOUSEテーブルのサイズは関係ありません)。

一方、数百万の家屋と何百万もの住民と一致させる必要がある場合は、SDO_JOINアプローチが効率的になります。

SDO_INSIDEのアプローチがあまりにも効率的にできることに注意してください:あなたがして使用並列処理(は、Oracle 12.1または12.2 は、Oracle Spatialおよびグラフのライセンスを適切なを持っているを使用する場合のみ)SPATIAL_VECTOR_ACCELERATIONを有効にしてください。

関連する問題