2017-10-30 16 views
0

오라클에는 공간 관계를 기반으로 조인 테이블을 수행하는 데 사용되는 SDO_JOIN 테이블 함수가 있습니다.오라클에서 공간 조인을 수행하는 적절한 방법은 무엇입니까?

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'; 
예제 쿼리는 집에 이런 일이 무엇인지 지역을 찾을 수

정확하게 두 번째 방법을 사용하는 것이 더 쉽습니다. 공간 조인을 수행하는 적절한 방법인지 여부에 관계없이 Oracle 설명서를 찾을 수 없었습니다.

두 가지 방법간에 차이점이 있습니까? 있다면, 뭐야? 없는 경우에는 어떤 스타일이 더 일반적입니까?

답변

0

성능 차이가 있습니다.

첫 번째 방법 (SDO_JOIN)은 각 테이블의 RTREE 색인을 일치시켜 후보를 분리합니다.

두 번째 방법은 NEIGHBORHOOD 테이블의 각 지오메트리에 대해 HOUSE 테이블을 검색합니다.

테이블의 크기, 특히 NEIGHBORHOOD 테이블의 크기 또는 더 정확하게는 쿼리가 실제로 사용하는 NEIGHBORHOOD 테이블의 행 수에 따라 다릅니다. NEIGHBORHOOD 테이블이 작 으면 (1000 행 미만) 두 번째 접근법이 좋습니다 (HOUSE 테이블의 크기는 중요하지 않습니다).

한편, 수백만 개의 집과 수백만 개의 집을 일치시켜야하는 경우 SDO_JOIN 방식이 더 효율적입니다.

SDO_INSIDE 접근 방식도 효율적으로 될 수 있음을 참고 : 당신이 사용할 병렬 처리 (오라클 12.1 또는 12.2 오라클 공간 및 그래프에 대한 라이센스를 적절한를를 사용하는 경우에만) SPATIAL_VECTOR_ACCELERATION 수 있도록해야합니다.