Ich habe eine Tabelle Punkte mit einer Spalte Punkt des Typs GEOGRAPHY. Ich verwende diesen Code den nächsten Punkt zu erhalten:wählen Sie den nächstgelegenen Punkt SQL-Server räumliche
DECLARE @Wgs84Longitude FLOAT;
DECLARE @Wgs84Latitude FLOAT;
DECLARE @Point GEOGRAPHY = Geography::STPointFromText(N'POINT('
+ CAST(@Wgs84Longitude AS NVARCHAR(MAX))
+ N' '
+ CAST(@Wgs84Latitude AS NVARCHAR(MAX))
+ N')', 4326);
SELECT
TOP 1
*
FROM Points
ORDER BY @Point.STDistance(Point) ASC;
Die Punkte-Tabelle hat diesen Index:
CREATE SPATIAL INDEX SpatialIndex ON Points (Point);
Leider ist die Abfrage ist ziemlich langsam. Gibt es etwas, was ich verbessern kann, um es schneller zu machen (indexieren und/oder abfragen)?
PS:
ich auch mit einigen Aromen dieser gespielt:
CREATE SPATIAL INDEX SpatialIndex ON [Core].[InternationalPostcodeList](Point)
USING GEOGRAPHY_GRID
WITH
(
--BOUNDING_BOX =(-8.164229, 49.18581, 8.05384, 60.717093)
GRIDS=(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH)
, CELLS_PER_OBJECT = 64
, PAD_INDEX = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY];
Die Leistung immer noch nicht akzeptabel ist.
Danke. Wenn ich die WHERE-Klausel wie im Artikel vorgeschlagen einführe, um die Verwendung des räumlichen Index scheinbar zu erzwingen, wird die Abfrage noch langsamer ausgeführt. – cs0815
@csetzkorn Wie groß ist die Tabelle (in Zeilen) und wie hoch sind die aktuellen Zeiten? –
Etwa 2,5 Millionen Zeilen ... – cs0815