我在 SQL Server 2008 R2 Express 数据库中有大约 7500 万条记录。每个都是对应于某个值的 lat long。该表有地理列。我正在尝试为给定的纬度经度(点)找到一个最近的邻居。我已经有了一个带有空间索引的查询。但是根据记录在数据库中的位置,比如第一季度或上季度,查询可能需要大约 3 到 30 秒才能找到最近的邻居。我觉得这可以通过优化查询或空间索引来优化以提供更快的结果。现在应用了一些具有默认设置的空间索引。这是我的表和查询的样子。
CREATE TABLE lidar(
[id] [bigint] IDENTITY(1,1) NOT NULL,
[POINTID] [int] NOT NULL,
[GRID_CODE] [numeric](17, 8) NULL,
[geom] [geography] NULL,
CONSTRAINT [PK_lidar_1] PRIMARY KEY CLUSTERED ([id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我正在使用的空间索引:
CREATE SPATIAL INDEX [SPATIAL_lidar] ON [dbo].[lidar] ([geom]) 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) ON [PRIMARY]
这是我正在使用的查询:
declare @ms_at geography = 'POINT (-95.66 30.04)';
select TOP(1) nearPoints.geom.STAsText()as latlon
from
(
select r.geom
from lidar r With(Index(SPATIAL_lidar))
where r.geom.STIntersects(@ms_at.STBuffer(1000)) = 1
) nearPoints
这是我的数据库中的 lat longs 示例。给出准确度和密度的概念。所有 7000 万条记录都针对一个城市(激光雷达数据)
POINT (-95.669434934023087 30.049513838913736)
现在这个查询给了我上面描述的结果,但我想尽可能地提高性能。我的猜测是通过调整空间索引的默认值,我可能能够提高性能。这有什么线索吗?
我尝试将缓冲区从 10 更改为 1000,但结果几乎相同。
也欢迎任何其他改进性能的建议。
这是我现在使用的系统:
Windows 7 64bit Professional
Intel(R) Core(TM)2 Quad CPU Q9650 @ 3.00GHz (4 CPUs), ~3.0GHz
Ram: 8 GB
NVIDIA GeForce 9500 GT