2014-09-08 4 views
5

Ich verwende den geographischen SQL Server-Datentyp, um den Speicherort der Datensätze in meiner Datenbank zu speichern. Ich möchte alle Datensätze innerhalb einer bestimmten Entfernung von einem bestimmten Ort wählen:Wählen Sie Datensätze aus einer SQL Server-Datenbank mit Geografie und Entfernung

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326) 
DECLARE @distance AS INT = 10000 

SELECT * 
FROM records 
WHERE records.location.STDistance(@location) <= @distance 

Mit ein paar Dutzend Datensätze in meiner Testdatenbank diese ziemlich schnell läuft, und ich habe keine Probleme, aber ich weiß, Diese WHERE-Klausel führt STDistance für alle Datensätze in meiner Datenbank aus, und sobald ich Tausende von Datensätzen habe, wird der Crawlvorgang verlangsamt.

Gibt es einen besseren Weg, dies zu tun? Vielleicht eine Art Region erstellen und zuerst Daten in benachbarten Regionen auswählen?

+3

Sie können eine Reihe tun Kästen begrenzt den Bereich von lat/longs zu verengen, die in der ST_Distance Funktion geprüft werden ... jedoch würde ich empfehlen, OTG lassen tun. Führen Sie eine Google-Suche für die räumliche Indexierung von MSSQL durch – Twelfth

+2

[Überblick über räumliche Indizes] (http://msdn.microsoft.com/en-us/library/bb895265.aspx) – wdosanjos

Antwort

1

Sie möchten auf jeden Fall einen räumlichen Index einrichten, wie @Twelfth empfiehlt. Sie möchten auch Ihre Suche nach einer Entfernung durchführen, nicht nach Entfernung, um den räumlichen Index besser auszunutzen.

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326) 
DECLARE @distance AS INT = 10000 
DECLARE @range AS geography = @location.STBuffer(@distance) 

SELECT * 
FROM records 
WHERE records.location.STIntersects(@Range) = 1 
Verwandte Themen