【问题标题】:Select records from a SQL Server database using geography and distance使用地理和距离从 SQL Server 数据库中选择记录
【发布时间】:2014-09-08 18:57:43
【问题描述】:

我正在使用 SQL Server 地理数据类型将记录的位置存储在我的数据库中。 我想选择给定位置给定距离内的所有记录:

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326)
DECLARE @distance AS INT = 10000

SELECT * 
FROM records
WHERE records.location.STDistance(@location) <= @distance

在我的测试数据库中有几十条记录,它运行得非常快,我没有任何问题,但我知道 WHERE 子句正在针对我数据库中的所有记录运行 STDistance,一旦我有数千条记录,它会慢慢爬起来。

有没有更好的方法来做到这一点?也许创建某种区域并首先在相邻区域中选择数据?

【问题讨论】:

  • 你可以做一系列的边界框来缩小在 ST_Distance 函数中检查的纬度/经度的范围......但是,我建议让 MIcrosoft 去做。为 MSSQL 空间索引做一个谷歌

标签: sql sql-server select sqlgeography


【解决方案1】:

您绝对希望按照@Twelfth 的建议设置空间索引。您还希望在范围而不是距离上进行搜索,以更好地利用空间索引。

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326)
DECLARE @distance AS INT = 10000
DECLARE @range AS geography = @location.STBuffer(@distance)

SELECT * 
FROM records
WHERE records.location.STIntersects(@Range) = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多