Ho un grande database pieno di clienti, implementato in SQL Server 2005. I clienti hanno latitudine e longitudine, rappresentati come Decimal(18,15)
. La più importante di query di ricerca nel database cerca di trovare tutti i clienti nei pressi di un certo luogo come questo:Quanto è buono il tipo di dati geografici in SQL Server 2008?
(Addresses.Latitude - @SearchInLat) BETWEEN -1 * @LatitudeBound AND @LatitudeBound)
AND ((Addresses.Longitude - @SearchInLng) BETWEEN -1 * @LongitudeBound AND @LongitudeBound)
Quindi, questo è un metodo molto semplice. @LatitudeBound
e @LongitudeBound
sono solo numeri, utilizzati per ritrarre tutti i clienti all'interno di un rettangolo di delimitazione del punto @SearchInLat, @SearchInLng
. Una volta che i risultati arrivano a un PC client, alcuni risultati vengono filtrati in modo che ci sia un cerchio di delimitazione piuttosto che un rettangolo. (Questo viene fatto sul PC client per evitare il calcolo delle radici quadrate sul server.)
Questo metodo ha funzionato abbastanza bene in passato. Tuttavia, ora vogliamo fare in modo che la ricerca faccia cose più interessanti, ad esempio, se il numero di risultati riportati è più prevedibile o se l'utente aumenta in modo dinamico la dimensione del raggio di ricerca. Per fare questo, ho esaminato la possibilità di ugprading in SQL Server 2008, con il suo tipo di dati geografici, gli indici spaziali e le funzioni di distanza. La mia domanda è questa: quanto sono veloci questi?
Il vantaggio della semplice query che abbiamo al momento è che è molto veloce e non richiede prestazioni elevate, il che è importante in quanto viene chiamato molto spesso. Quanto velocemente sarebbe una query basata intorno a qualcosa di simile:
SearchInPoint.STDistance(Addresses.GeographicPoint) < @DistanceBound
essere al confronto? Gli indici spaziali funzionano bene e STDistance è veloce?