我有两个带点数据的表。
表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
它可以追溯到永远。
发生了什么事?
答案 0 :(得分:1)
空间索引严重处理NULL(并且由于OP自己也试用了EMPTY实例)。
最佳解决方案是将空间数据存储在单独的链表中,该表仅包含每个非空和非空空间实例的记录。
然而, 适用于OP的一种解决方法是将所有空值设置为POINT(0,0)坐标,但是对于更多全局应用程序,这可能会产生不正确的结果 - 因此,如果您能够重构数据,则首选方法是最佳的。