2014-04-15 14 views
6

I ~ 400k punti di interesse archiviati in GEOGRAFIA sql spaziali.SQL Ottimizzazione di un indice spaziale per punti geografici localizzati

sarò l'interrogazione questi punti con PointOfInterest.STDistance (@CentralPoint) < @Radius a trovare pointofinterest di una determinata distanza del @CentralPoint inviato alla query.

Ho letto un po 'della stratificazione delle griglie e vorrei che qualcuno sapesse che le loro cose consigliassero il modello di griglia più sensato. Il valore predefinito è

level_1 = MEDIA, level_2 = MEDIA, level_3 = MEDIA, LEVEL_4 = MEDIO

Ma la mia situazione è tale che io avere solo punti di interesse all'interno theUK. Nonostante sia fantastico, prendiamo solo una specifica relativa di terra ferma, quindi mi chiedevo se per questo caso ci fosse un modello di griglia migliore da usare nell'indice spaziale.

Essendo basato sulla geografia Non posso usare le bellissime scatole di delimitazione della geometria. Inoltre sto usando SQL Azure che non sembra avere il proc memorizzato spaziale di aiuto :(

risposta

2

Come sempre con l'indicizzazione spaziale, si finisce per scoprire che testare una varietà di impostazioni della griglia sul proprio set di dati può dare risultati diversi a quelli degli altri. Detto questo, trovo l'impostazione Basso a tutti i livelli, o Medio, Basso, Basso, Basso produce ottimi risultati con Punti a causa della loro natura semplicistica.

Per utilizzare al meglio l'indice, prendere in considerazione, facoltativamente, il buffering del punto e il controllo di un incrocio. Anche in questo caso, ho trovato spesso produce meglio costantemente volte a basso risultato, ma testarlo sui dati.

DECLARE @point GEOGRAPHY = GEOGRAPHY::STPointFromText('POINT(<coords>)', 4326); 
DECLARE @radius INT = 1000; 

SELECT 
* 
FROM <table> 
WHERE <GeographyColumn>.STIntersects(@point.STBuffer(@radius)) = 1; 

Cerca di stare lontano dall'urgenza di passare a Geometry, dal momento che anche se produrrà query sempre leggermente più veloci, avrà più possibilità di produrre risultati "errati" a causa del lavoro con un modello planare. Detto questo, se le distanze di ricerca sono abbastanza piccole, la differenza non sarà evidente nella maggior parte degli scenari.

+0

Grazie! Per favore, puoi spiegare brevemente i vantaggi del tuo suggerimento di griglie di basso livello come avrei pensato che il più preciso 'alto' suonava il migliore quando li leggevi – BritishDeveloper

+0

@BritishDeveloper, Beh, usando griglie di basso livello mantiene l'indice relativamente leggero e veloce - LLLL ha solo un massimo di 65536 celle di livello 4 al suo interno. I test su diverse serie di informazioni (dati del Regno Unito) generalmente hanno dato risultati migliori o uguali alle prestazioni rispetto ad altre combinazioni (li ho provati tutti). Tuttavia, quando si ha a che fare con i poligoni è necessario un livello superiore per gestire meglio la complessità, oltre a sperimentare le celle per valore dell'oggetto. C'erano alcuni casi in cui ho trovato MLLL o HLLL migliori, quindi consiglio anche di provarli, ma con 400k righe stiamo parlando di 10 di ms top –