1

Ich möchte zwei Geografie Spalte mit StContains-Funktion vergleichen, aber es verlangsamen die Abfrage und die Ausgabe wird nach 30-40 Sekunden erhalten, was ein großes Leistungsproblem ist.Vergleichen von Geografie-Spalte mit STContains verlangsamen die Abfrage in SQL Server

ich unten Abfrage bin mit:

SELECT DISTINCT 
      T.[LocationID], G.[Boundary].STContains(ESP.GeographyValue) 
    FROM [#TempTable] T 
    CROSS JOIN [dbo].[GeographyTable] G 
    INNER JOIN [dbo].LocationTable ESP ON T.LocationID = ESP.LocationID 
    WHERE G.[ID] = 1 

Hier sind sowohl Boundary und GeographyValue sind Geographie-Datentyp.

Wenn ich entferne G. [Grenze] .STContains (ESP.GeographyValue) dann Abfrage wird in 0 Sekunden ausgeführt, so dass das Hauptleistungsproblem wegen StContains ist.

Das Ergebnis enthält 7000 Datensätze, die möglicherweise nicht das Problem sein.

Update:

Ich habe räumlichen Index hinzugefügt, um sowohl die Spalten, aber immer noch die Ausführung ist langsam. Durch eine einfache Abfrage läuft dauert es 10 secs.I unter Abfrage verwendet:

select ES.* from LocationTable ES INNER JOIN GeographyTable G ON ES.GeographyValue.STEquals(G.Boundary) = 1 Where G.Id = 1 

Ich versuchte STContains auch, aber noch kein Glück.

+1

Was ist der Zweck dieser Abfrage, die Sie 7000 verschiedenen Standorten vergleichen müssen? Räumliche Vergleiche sind komplex und ressourcenintensiv. Es kann also eine Weile dauern und Sie machen 7000 von ihnen! Haben Sie einen räumlichen Index für Ihre Geografie-Spalten? – iamdave

+0

Ich habe eine Liste von Geography auf der UI, über die der Benutzer eine von denen auswählen kann, und ich möchte GeographyTable mit passendem Standort vergleichen. LocationTable ist in einer anderen Datenbank vorhanden, daher kann ich keine GeoTable ID-Spalte hinzufügen. Der räumliche Index ist in beiden Tabellen nicht vorhanden. Kannst du sagen, zu welcher Tabelle ich sie hinzufügen muss und wie? –

+0

Räumliche Indizes werden in Ihren räumlichen Spalten angezeigt ... Wenn Ihre Benutzer * one * Geography über Ihre Benutzeroberfläche auswählen, warum vergleichen Sie dann alle 7000? Vergleichen Sie einfach den, den sie auswählen. – iamdave

Antwort

2

Force-Code räumlichen Index zu verwenden, unter Code [dbo].[GeographyTable] G WITH (INDEX(SI_Geofence_Boundary))

Ihre überarbeitete Abfrage aussehen wird,

SELECT DISTINCT 
      T.[LocationID], G.[Boundary].STContains(ESP.GeographyValue) 
    FROM [#TempTable] T 
    CROSS JOIN [dbo].[GeographyTable] G WITH (INDEX(SI_Geofence_Boundary)) 
    INNER JOIN [dbo].LocationTable ESP ON T.LocationID = ESP.LocationID 
    WHERE G.[ID] = 1 

Es wäre Ausführungszeit von 30 bis 40 Sekunden auf 23 Sekunden zu reduzieren.

Für weitere Informationen lesen Sie die link