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文档加入。
这两种方法有什么区别吗?如果有,什么?如果没有,哪种风格更常见?
答案 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许可时)并使用并行性。