SQL Spatial Join - 导致问题的空值

时间:2015-10-09 14:44:09

标签: sql sql-server sql-server-2012 geospatial spatial

我有两个带点数据的表。 表1 - 无零点。
表2 - 大约一半的点为空。

查询:

SELECT
  *
FROM
  Table1 
INNER JOIN
  Table2 
ON
  Table1.Point.STBuffer(2.5).STIntersects(Table2.Point) = 1
WHERE
  Table1.Point IS NOT NULL
  AND Table2.Point IS NOT NULL

需要8个多小时才能完成。

如果我将数据复制到这样的临时表:

INSERT INTO TempTable SELECT * FROM Table2 WHERE Point IS NOT NULL

同样的查询大约需要40秒。

如果我重新添加一些空数据。

INSERT INTO TempTable SELECT TOP 10000 * FROM Table2 WHERE Point IS NULL

它可以追溯到永远。

发生了什么事?

1 个答案:

答案 0 :(得分:1)

空间索引严重处理NULL(并且由于OP自己也试用了EMPTY实例)。

最佳解决方案是将空间数据存储在单独的链表中,该表仅包含每个非空和非空空间实例的记录。

然而, 适用于OP的一种解决方法是将所有空值设置为POINT(0,0)坐标,但是对于更多全局应用程序,这可能会产生不正确的结果 - 因此,如果您能够重构数据,则首选方法是最佳的。