Ho circa 75 milioni di record in un database di SQL Server 2008 R2 Express. Ciascuno è un lat long corrispondente ad un certo valore. La tabella ha una colonna geografica. Sto cercando di trovare un vicino più vicino per una determinata latitudine (punto). Ho già una query con l'indice spaziale in atto. Ma a seconda di dove si trova il record nel database, ad esempio il primo o l'ultimo trimestre, la query può richiedere da 3 a 30 secondi per trovare il vicino più vicino. Penso che questo possa essere ottimizzato per dare risultati molto più veloci ottimizzando la query o l'indice spaziale. In questo momento ha applicato un po 'l'indice spaziale con le impostazioni predefinite. Ecco come sono la mia tabella e query.
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]
L'indice spaziale che sto 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]
Ecco la query che sto 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
Ecco un esempio di long long nel mio database. per dare un'idea di precisione e densità. Tutti i 70 milioni di record sono per una città (dati Lidar).
POINT (-95.669434934023087 30.049513838913736)
Ora questa query mi dà risultati come ho descritto sopra, ma voglio migliorare le prestazioni il più possibile. La mia ipotesi è che modificando i valori predefiniti dell'indice spaziale che posso essere sopra per ottimizzare meglio le prestazioni. Qualche idea su questo?
Ho provato a variare il buffer da 10 a 1000 ma con quasi gli stessi risultati.
Anche qualsiasi altro suggerimento per migliorare le prestazioni è il benvenuto.
Ecco il sistema che sto usando in questo momento:
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
tag.