SQL 空间连接 - 空值导致问题
SQL Spatial Join - Null Values Causing Problems
我有两个 table 点数据。
Table 1 - 无空分。
Table 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 个多小时才能完成。
如果我像这样将数据复制到临时 table:
INSERT INTO TempTable SELECT * FROM Table2 WHERE Point IS NOT NULL
同样的查询大约需要 40 秒。
如果我重新添加一些空数据。
INSERT INTO TempTable SELECT TOP 10000 * FROM Table2 WHERE Point IS NULL
它可以追溯到永远。
发生了什么事?
空间索引不能很好地处理 NULL(并且还要感谢 OP 自己的试验 EMPTY 实例)。
最佳解决方案是将空间数据存储在单独的链接 table 中,其中仅包含每个非空和非空空间实例的记录。
但是,
适用于 OP 的一种解决方法是将所有空值设置为 POINT(0,0) 坐标,但是对于更多的全局应用程序,这可能会产生不正确的结果 - 因此,如果您能够重组数据,则首选方法是最好的。
我有两个 table 点数据。
Table 1 - 无空分。
Table 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 个多小时才能完成。
如果我像这样将数据复制到临时 table:
INSERT INTO TempTable SELECT * FROM Table2 WHERE Point IS NOT NULL
同样的查询大约需要 40 秒。
如果我重新添加一些空数据。
INSERT INTO TempTable SELECT TOP 10000 * FROM Table2 WHERE Point IS NULL
它可以追溯到永远。
发生了什么事?
空间索引不能很好地处理 NULL(并且还要感谢 OP 自己的试验 EMPTY 实例)。
最佳解决方案是将空间数据存储在单独的链接 table 中,其中仅包含每个非空和非空空间实例的记录。
但是, 适用于 OP 的一种解决方法是将所有空值设置为 POINT(0,0) 坐标,但是对于更多的全局应用程序,这可能会产生不正确的结果 - 因此,如果您能够重组数据,则首选方法是最好的。