在Oracle中进行空间连接的正确方法是什么?

时间:2017-10-30 17:45:13

标签: oracle11g spatial-query oracle-spatial

Oracle有一个名为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;

但是我通过在on子句中使用空间关系进行常规连接得到了相同的结果:

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

我更喜欢第二种方法,因为我认为它更容易理解到底发生了什么,但是我无法找到任何关于这是否是正确的空间方法的Oracle文档加入。

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

1 个答案:

答案 0 :(得分:1)

不同之处在于性能。

第一种方法(SDO_JOIN)通过匹配每个表上的RTREE索引来隔离候选者。

第二种方法将在HOUSE表中搜索NEIGHBORHOOD表的每个几何。

在很大程度上取决于你的表的大小,特别是NEIGHBORHOOD表的大小 - 或者更准确地说,取决于你的查询实际使用的NEIGHBORHOOD表的行数。如果NEIGHBORHOOD表很小(少于1000行),那么第二种方法是好的(并且HOUSE表的大小无关紧要)。

另一方面,如果您需要匹配数百万个房屋和数百万个社区,那么SDO_JOIN方法将更有效率。

请注意,SDO_INSIDE方法也很有效:只需确保启用SPATIAL_VECTOR_ACCELERATION(仅当您使用Oracle 12.1或12.2 您拥有适当的Oracle Spatial and Graph许可时)并使用并行性。