如何优化包含地理列的sql表

时间:2015-11-11 06:33:02

标签: sql sql-server sql-server-2014

我们已将地理数据存储在"位置"表格并基于此列我们正在搜索给定输入的最近位置。以下查询用于获取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中提高查询性能吗?

1 个答案:

答案 0 :(得分:2)

有两件事,不能保证解决问题,但肯定有帮助。他们都是相关的:

SELECT CenterLocationId,
       [Location].Stdistance(@h) * Cast(0.000621371 AS FLOAT(53)) AS Distance
FROM   [dbo].[CenterLocation]
WHERE  [Location].Stdistance(@h) <= @Distance / Cast(0.000621371 AS FLOAT(53))
       AND IsDeleted = 0
ORDER  BY [Location].Stdistance(@h)

也就是说,更喜欢不在WHERE子句中对依赖于列值的表达式执行数学运算 - 您迫使服务器为每一行执行该数学运算并破坏使用索引的任何可能性。< / p>

此外,类似地,在ORDER BY子句中执行乘法是没有意义的,因为乘法(乘以正数)不会改变排序。