sql - 使用地理位置和距离从 SQL Server 数据库中选择记录

标签 sql sql-server select sqlgeography

我正在使用 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,一旦我有数千条记录,它会慢得像爬行一样。

有更好的方法吗?也许创建某种区域并首先选择邻近区域中的数据?

最佳答案

您肯定希望按照 @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

关于sql - 使用地理位置和距离从 SQL Server 数据库中选择记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25731233/

相关文章:

sql-server - 从 SELECT 创建数据库名称

MySQL:子查询:无输出

sql - 用于检测 PostgreSQL 趋势的聚合函数

SQL 选择 : I need a "IN ALL" Clause

sql - Oracle - 分组依据为 "steps"

sql - 我加入第二张 table 时的总和不正确

mysql - 如何将 1GB .sql 文件导入 WAMP/phpmyadmin

python - 如何通过将新产品添加到 ManyToMany 字段来动态添加字段

javascript - Node : How to use LIKE with an input parameter in the query? 的 MSSQL

sql-server - HTTP 状态 500 - 此驱动程序不支持 Java 运行时环境 (JRE) 版本 1.7