【问题标题】:How to optimize the sql table containing the geography column如何优化包含地理列的sql表
【发布时间】: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


【解决方案1】:

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

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 子句中对依赖于列值的表达式执行数学运算 - 您会强制服务器对每一行执行数学运算并破坏使用索引的任何可能性。

同样,在ORDER BY 子句中执行乘法是没有意义的,因为乘法(正数)不会改变顺序。

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 2011-06-27
    • 2013-01-30
    • 2013-05-02
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    相关资源
    最近更新 更多