Ich habe ungefähr 75 Millionen Datensätze in einer SQL Server 2008 R2 Express-Datenbank. Jedes ist eine Lat-Länge, die einem bestimmten Wert entspricht. Die Tabelle enthält die Spalte "Geografie". Ich versuche, einen nächsten Nachbarn für einen bestimmten Längengrad (Punkt) zu finden. Ich habe bereits eine Abfrage mit räumlichem Index. Abhängig davon, wo sich der Datensatz in der Datenbank befindet, beispielsweise im ersten oder letzten Quartal, kann die Abfrage 3 bis 30 Sekunden dauern, bis der nächste Nachbar gefunden ist. Ich bin der Meinung, dass dies optimiert werden kann, um viel schnellere Ergebnisse zu erzielen, indem die Abfrage oder der räumliche Index optimiert werden. Im Moment haben einige den räumlichen Index mit den Standardeinstellungen angewendet. So sieht meine Tabelle und Abfrage aus.
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]
Der von mir verwendete räumliche Index:
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]
Hier ist die Abfrage, die ich verwende:
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
Hier ist ein Beispiel für Lat Longs in meiner Datenbank. um eine Vorstellung von Genauigkeit und Dichte zu geben. Alle 70 Millionen Datensätze beziehen sich auf eine Stadt (Lidar-Daten).
POINT (-95.669434934023087 30.049513838913736)
Mit dieser Abfrage erhalte ich nun die oben beschriebenen Ergebnisse, aber ich möchte die Leistung so weit wie möglich verbessern. Meine Vermutung ist, dass ich die Standardwerte des räumlichen Indexes, über dem ich möglicherweise bin, optimiere, um die Leistung besser zu optimieren. Irgendwelche Hinweise dazu?
Ich habe versucht, den Puffer von 10 auf 1000 zu variieren, aber mit fast den gleichen Ergebnissen.
Auch alle anderen Vorschläge zur Verbesserung der Leistung sind willkommen.
Hier ist das System, das ich gerade benutze:
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 hinzufügen .