【发布时间】:2015-11-11 06:33:02
【问题描述】:
我们已将地理数据存储在“位置”表中,并根据此列搜索给定输入的最近位置。下面的查询用于获取 25 英里内的最近位置,此查询需要 4 秒以上才能检索 4000 条记录。我们甚至在位置字段上创建了空间索引。
DECLARE @Distance INT
SET @Distance =25
DECLARE @h sys.GEOGRAPHY
SET @h =CONVERT(sys.GEOGRAPHY, 0xE6100000010C92B06F27119D4140111AC1C6F53554C0)
SELECT CenterLocationId,
[Location].Stdistance(@h) * Cast(0.000621371 AS FLOAT(53)) AS Distance
FROM [dbo].[CenterLocation]
WHERE [Location].Stdistance(@h) * Cast(0.000621371 AS FLOAT(53)) <= @Distance
AND IsDeleted = 0
ORDER BY [Location].Stdistance(@h) * Cast(0.000621371 AS FLOAT(53))
谁能建议如何在 sql server 2014 中提高此查询性能?
【问题讨论】:
-
尝试重新索引表?看看这是否有帮助??
-
我不太适合地理数据,但它可能有助于对 正方形区域 内的所有位置进行预选(例如 CTE)(简单的数学... ) 你的距离,只为这个区域内的点做繁重的计算?
-
避免在查询中使用 UDF。当然有时你必须这样做,但它们会异常增加执行时间。因此,您在该列上有空间索引,没关系。你需要摆脱像“cast”和那个乘数这样的函数。我的建议是制作将存储该 FLOAT 的列。另外,如果您总是使用 Stdistance * 0.000621371,您可以考虑制作 PERSISTED 列。
标签: sql sql-server sql-server-2014