2014-09-08 13 views
5

Sto utilizzando il tipo di dati geografici di SQL Server per memorizzare la posizione dei record nel mio database. Vorrei selezionare tutti i record all'interno di una data distanza di un determinato luogo:Seleziona record da un database SQL Server utilizzando la geografia e la distanza

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

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

Con un paio di dozzine di record nel mio database di prova questo funziona abbastanza velocemente e non ho problemi, ma so quella clausola WHERE sta eseguendo STDistance contro tutti i record nel mio database, e una volta che ho migliaia di record, rallenterà fino alla ricerca per indicizzazione.

C'è un modo migliore per farlo? Forse creare una sorta di regione e selezionare prima i dati nelle regioni limitrofe?

+3

Si può fare una serie di delimitazione scatole per restringere la gamma di latitudine/longitudine che vengono controllati nella funzione ST_Distance ... però, io consiglierei di lasciar fare Microsoft esso. Fai un google per l'indicizzazione spaziale MSSQL – Twelfth

+2

[Panoramica sugli indici spaziali] (http://msdn.microsoft.com/en-us/library/bb895265.aspx) – wdosanjos

risposta

1

Si consiglia di impostare un indice spaziale come raccomandato da @Twelfth. Vuoi anche fare la tua ricerca su un intervallo, non sulla distanza per sfruttare meglio l'indice spaziale.

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 
Problemi correlati