Wir haben eine einfache SQL Server-Tabelle mit Geodaten, die folgendermaßen aussieht:
CREATE TABLE [dbo].[Factors](
[Id] [int] IDENTITY(1,1) NOT NULL,
[StateCode] [nvarchar](2) NOT NULL,
[GeoLocation] [geography] NULL,
[Factor] [decimal](18, 6) NOT NULL,
CONSTRAINT [PK_dbo.Factors] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
Wir haben momentan mehr als 100.000 Zeilen darin, aber das wird voraussichtlich auf Millionen anwachsen.
Wir führen darauf Abfragen aus, die folgendermaßen aussehen:
declare @state nvarchar(2) = 'AL'
declare @point geography = geography::STGeomFromText('POINT(-86.19146040 32.38225770)', 4326)
select top 3
Lat,
Lon,
Factor,
GeoLocation.STDistance(@point) as Distance
from dbo.Factors
where StateCode = @state and GeoLocation.STDistance(@point) is not null
order by Distance
Hier ist das bisschen komisch. Die Daten in dieser Tabelle sind unvollständig: Wir haben sie zum Beispiel für die südlichen Teile eines Bundesstaates, aber nicht für den gesamten Bundesstaat. Wenn der Punkt, nach dem wir suchen, innerhalb einiger hundert Meter von Punkten liegt, für die wir Daten haben (z. B. aus dem südlichen Teil des Bundesstaates), gibt die Abfrage eine Untersekunde zurück. Wenn es jedoch beispielsweise 100 Kilometer vom nächsten Datenpunkt entfernt ist (z. B. wenn der Zielpunkt aus dem nördlichen Teil des Bundesstaates stammt), dauert die Rückgabe der Abfrage etwa 3 Minuten. In beiden Fällen geben Abfragepläne an, dass sie mit einem Scan des Geodatenindex beginnen. Daher ist es nicht das Problem, das manchmal auftritt, dass SQL Server nicht herausfinden kann, dass der betreffende Index verwendet werden soll.
Ich gehe davon aus, dass dies etwas mit der Darstellung des Geoindex zu tun hat.
CREATE SPATIAL INDEX IX_Factors_Spatial
ON [dbo].[Factors] (GeoLocation)
USING GEOGRAPHY_AUTO_GRID
WITH (
CELLS_PER_OBJECT = 16,
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON);
Aber ich weiß nicht, dass ich die Details gut genug verstehe, um das Problem in den Griff zu bekommen.
Irgendwelche Vorschläge, wie Sie dieses Problem beheben können?
dbcc freeproccache
führen Sie eine Abfrage für den nördlichen Teil eines Bundesstaates aus, um festzustellen, ob dies schnell geht.