gpt4 book ai didi

sql - 从地理列中搜索附近的点

转载 作者:行者123 更新时间:2023-12-04 14:02:01 25 4
gpt4 key购买 nike

我的表中有一个带有空间索引的地理类型列。如何在使用索引提高性能的同时选择给定纬度/经度 X 米范围内的前 N ​​行?

最佳答案

当您说“在使用索引时”——您是什么意思?

我(今天)才刚刚开始试验 SQL 2012 及其 Geography 数据类型,但以下内容可能有用 - 我确实知道您正在使用 2008-R2

创建一些数据:

CREATE TABLE SpatialTable 
( id int IDENTITY (1,1) PRIMARY KEY,
GeogCol1 geography,
GeogCol2 AS GeogCol1.STAsText() );
GO

INSERT INTO SpatialTable (GeogCol1)
VALUES
(geography::STGeomFromText('POINT(-122.360 47.656)',4326)),
(geography::STGeomFromText('POINT(-122.343 47.656)',4326)),
(geography::STGeomFromText('POINT(-122.358 47.660)',4326)),
(geography::STGeomFromText('POINT(-122.348 47.649)',4326)),
(geography::STGeomFromText('POINT(-122.348 47.658)',4326)),
(geography::STGeomFromText('POINT(-122.358 47.653)',4326))

创建索引:

CREATE SPATIAL INDEX Spatialindex ON SpatialTable ( GeogCol1 ) USING GEOGRAPHY_GRID 
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
)

定义兴趣点:

DECLARE @g geography;
SET @g = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);

在点的 750m 范围内找到最近的 2

SELECT TOP 2
@g.STDistance(st.GeogCol1) AS [DistanceFromPoint (in meters)]
, st.GeogCol2
, st.id
FROM SpatialTable st WITH(INDEX(SpatialIndex))
WHERE @g.STDistance(st.GeogCol1) <= 750
ORDER BY @g.STDistance(st.GeogCol1) ASC

给予:

DistanceFromPoint (in meters) GeogCol2                 id
----------------------------- ------------------------ -----------
234.715604015178 POINT (-122.348 47.649) 4
711.760044795868 POINT (-122.358 47.653) 6

SQL 执行计划 表明正在使用索引,并且 this website建议返回的距离是正确的

如果这不是您需要的,请告诉我,我正在尝试自己学习,所以任何修改都是好的!

*** 编辑 ****我添加了一个索引表提示来强制查询使用索引(按照这个 MSDN post )。该链接解释了该索引最初可能未被使用,因为 SQL 确定不使用该索引会更快。我上面示例的执行计划显示使用/不使用索引的比例为 97%/3%,因此在这种情况下,SQL 优化器的想法是正确的。

为什么 使用索引时查询变慢似乎是SO 上众多博客文章和问题的主题.

关于sql - 从地理列中搜索附近的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10192498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com