2011-09-05 10 views
7

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?

risposta

8

Se si gestisce solo una coppia Lat/Lng standard come si descrive, e tutto ciò che si fa è una semplice ricerca, quindi probabilmente non si otterrà molto in termini di aumento di velocità usando il tipo Geometry.

Tuttavia, se vuoi diventare più avventuroso come dici tu, passare a utilizzare i tipi Geometria ti aprirà un mondo di nuove possibilità per te e non solo per le ricerche.

Ad esempio (in base a un progetto a cui sto lavorando) è possibile (se si tratta di dati uk) scaricare le definizioni di poligono per tutte le città/villaggi/città per una determinata area, quindi fare riferimenti incrociati per cercare in un città particolare, o se tu avessi una mappa stradale, potresti scoprire quali clienti vivevano vicino alle principali vie di consegna, autostrade, strade primarie di ogni genere.

Si potrebbe anche fare un reportage molto elaborato, immaginare una mappa delle città, dove ogni schema è stato tracciato su una mappa, quindi ombreggiato con un colore per mostrare la densità dei clienti in un'area, qualche geometria semplice SQL sarà facilmente restituita si conta direttamente dal database, per rappresentare questo tipo di informazioni.

poi c'è il monitoraggio, non so quali dati si gestisce, o perché si dispone di clienti, ma se il vostro consegnare qualcosa, alimentando le coordinate di un furgone in, ti dice quanto è vicina a un dato cliente.

Per quanto riguarda la domanda è veloce STDistance? beh, è ​​difficile dirlo davvero, penso che una domanda migliore sia "È veloce rispetto a .....", è difficile dire di si o no, a meno che non si abbia qualcosa a cui confrontarsi.

indici spaziali sono uno dei motivi principali per lo spostamento dei dati su geograficamente database di conoscenza che sono ottimizzati per produrre i migliori risultati per un determinato compito, ma, come qualsiasi database, se si crea indici male, allora si otterrà brutta prestazione .

In generale si dovrebbe sicuramente vedere un aumento della velocità di qualche tipo, perché la matematica nell'ordinamento e nell'indicizzazione sono più consapevoli dello scopo dei dati piuttosto che essere semplicemente lineari in funzione come un normale indice.

Tenere a mente, inoltre, che quanto più robusto è il server SQL, i risultati migliori si ottengono.

Un ultimo punto da menzionare è la gestione dei dati, se si utilizza un database GIS consapevole, quindi si apre la strada per l'utilizzo di un pacchetto GIS come ArcMap o MapInfo per gestire, correggere e visualizzare i dati, ovvero le correzioni sono molto facili da fare puntando, cliccando e trascinando.

Il mio consiglio sarebbe quello di creare un tavolo affiancato a quello esistente, che è formattato per le operazioni spaziali, quindi scrivere alcuni processi memorizzati e fare alcuni test di temporizzazione, vedere quale risulta il migliore. Se si ha un aumento significativo solo delle operazioni di base che si eseguono, allora questa è solo giustificazione, se si tratta di un livello di parità su cui si basa realmente la tua decisione, quale nuova funzionalità vuoi effettivamente ottenere.

Problemi correlati