【问题标题】:What's the proper way to do a spatial join in Oracle?在 Oracle 中进行空间连接的正确方法是什么?
【发布时间】:2017-10-31 18:30:03
【问题描述】:

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 文档。

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

【问题讨论】:

    标签: oracle11g spatial-query oracle-spatial


    【解决方案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 的适当许可)并使用并行性.

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 2014-08-26
      • 2014-05-08
      • 1970-01-01
      • 2011-03-21
      • 2014-05-16
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      相关资源
      最近更新 更多