Tengo alrededor de 75 millones de registros en una base de datos SQL Server 2008 R2 Express. Cada uno es un lat largo correspondiente a algún valor. La tabla tiene columna de geografía. Estoy tratando de encontrar un vecino más cercano para una latitud, longitud (punto) dada. Ya tengo una consulta con índice espacial en su lugar. Pero dependiendo de dónde esté el registro en la base de datos, digamos el primer trimestre o el último trimestre, la consulta puede demorar de 3 a 30 segundos para encontrar el vecino más cercano. Creo que esto se puede optimizar para obtener resultados mucho más rápidos al optimizar la consulta o el índice espacial. En este momento se aplica parte del índice espacial con la configuración predeterminada. Así es como se ve mi tabla y mi consulta.
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]
El índice espacial que estoy usando:
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]
Aquí está la consulta que estoy usando:
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
Aquí hay una muestra de lat largos en mi base de datos. para dar una idea de precisión y densidad. Todos los 70 millones de registros son para una ciudad (datos Lidar).
POINT (-95.669434934023087 30.049513838913736)
Ahora esta consulta me da los resultados que describí anteriormente, pero quiero mejorar el rendimiento tanto como sea posible. Supongo que al ajustar los valores predeterminados del índice espacial, puedo estar por encima para optimizar mejor el rendimiento. ¿Alguna pista sobre esto?
Intenté variar el búfer de 10 a 1000 pero con casi los mismos resultados.
También cualquier otra sugerencia para mejorar el rendimiento es bienvenida.
Aquí está el sistema que estoy usando ahora:
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
lidar
etiqueta.