我们有一个简单的 SQL Server 表,其中包含如下所示的地理空间数据:
CREATE TABLE [dbo].[Factors](
[Id] [int] IDENTITY(1,1) NOT NULL,
[StateCode] [nvarchar](2) NOT NULL,
[GeoLocation] [geography] NULL,
[Factor] [decimal](18, 6) NOT NULL,
CONSTRAINT [PK_dbo.Factors] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
Run Code Online (Sandbox Code Playgroud)
我们现在有大约 100k+ 行,但预计会增长到数百万。
我们对其运行查询,如下所示:
declare @state nvarchar(2) = 'AL'
declare @point geography = geography::STGeomFromText('POINT(-86.19146040 32.38225770)', 4326)
select top 3
Lat,
Lon,
Factor,
GeoLocation.STDistance(@point) as Distance
from dbo.Factors
where StateCode = @state and GeoLocation.STDistance(@point) is not null
order by Distance
Run Code Online (Sandbox Code Playgroud)
不过,这有点奇怪。该表中的数据是参差不齐的:例如,我们得到了一个州南部的数据,但没有得到整个州的数据。如果我们搜索的点在我们获得数据的点的几百米内(例如,来自该州的南部),则查询返回亚秒级。但是,如果距离最近的数据点 100 公里(例如,如果目标点来自该州的北部),则查询最多需要 3 分钟左右才能返回。在这两种情况下,查询计划都表明它们是从地理空间索引的扫描开始的,所以这不是有时会发生的问题,SQL Server 无法确定它应该使用有问题的索引。
我的假设是它与地理空间索引的布局方式有关。 …