Oracle11g 在Oracle中执行空间联接的正确方法是什么?

Oracle11g 在Oracle中执行空间联接的正确方法是什么?,oracle11g,spatial-query,oracle-spatial,Oracle11g,Spatial Query,Oracle Spatial,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 neighb

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;
但是我通过在on子句中使用空间关系进行规则连接得到了相同的结果:

select 
    house.address,
    neighbourhood.name
from house
inner join neighbourhood
    on sdo_inside(house.geometry, neighbourhood.geometry) = 'TRUE';
我更喜欢第二种方法,因为我认为更容易理解到底发生了什么,但我找不到任何Oracle文档说明这是否是进行空间连接的正确方法


这两种方法有什么区别吗?如果有,什么?如果没有,哪种样式更常见?

区别在于性能

第一种方法SDO_JOIN通过匹配每个表上的RTREE索引来隔离候选对象

第二种方法将在HOUSE表中搜索邻域表的每个几何体

这在很大程度上取决于表的大小,特别是邻域表的大小,或者更准确地说,取决于查询实际使用的邻域表的行数。如果邻域表小于1000行,那么第二种方法是好的,豪斯表的大小无关紧要

另一方面,如果需要匹配数以百万计的房屋和数以百万计的社区,那么SDO_连接方法将更有效

请注意,SDO_INSIDE方法也很有效:只要确保只有在使用Oracle 12.1或12.2并且您拥有Oracle SPATIAL和Graph的适当许可证并使用并行性时,才启用SPATIAL_VECTOR_加速