2009-08-27 17 views
7

Tengo una aplicación donde básicamente tengo una gran tabla (100 millones de registros) de información, con cada fila que contiene un valor lat/long.¿Las características de SQL Server 2008 Spatial Data son útiles para el mapeo de consultas?

Estoy constantemente consultando esta tabla para obtener todos los registros que se ajustan dentro de un radio alrededor de cierto punto. Por ejemplo, "todos los registros dentro de 5 millas de 39.89288, -104.919434"

Para esto, tengo un índice sobre las columnas Lat/Long, obtengo el "cuadrado delimitador" de puntos y luego descarto todos los puntos que quedan fuera del círculo en mi aplicación ASP.Net, ya que eso fue más rápido que hacer el cálculo circular en SQL Server.
NOTA: Estos son todos los datos sobre los EE. UU., Por lo que considero que la Tierra es plana para mis cálculos, que es lo suficientemente precisa para mis necesidades.

Ahora, el principal problema con el índice Lat/Long es que es "un cuadrado" de puntos, y como estoy tratando de encontrar "Lat entre x y y" y "Long between x and y", realmente no puedo usar el índice de manera super eficiente, como podría hacerlo si estuviese buscando "una línea" de puntos.

He estado leyendo sobre las características espaciales de SQL 2008, pero no he encontrado suficiente información concreta para saber si esto es útil para mí.

Entonces, la pregunta es: ¿SQL 2008 tiene algún tipo de índice diferente que hará que este tipo específico de consulta sea mucho más rápido que con SQL 2005?

+0

¡Buena pregunta! He hecho algo muy parecido a lo que estás haciendo ahora en SQL2005, por lo que me interesaría saber qué se le ocurre a la gente –

Respuesta

3

encontré esto:

Para SQL 2008:
http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/sql-server-2008-proximity-search-with-th

Al parecer es posible

NOTA: La versión SQL 2005 de dicho artículo no funciona demasiado bien. He intentado ese tipo de cosas y funciona mejor simplemente obtener el cuadrado de SQL Server, y luego seleccionar el círculo en tu propio código.

Más enlaces de interés:

http://msdn.microsoft.com/en-us/library/bb964712.aspx
(por fin una explicación !!)

Y una consulta de ejemplo ... parecer se trata de cómo hacer la búsqueda que quiero (puntos dentro de un 5 círculo -milla):

DECLARE @Location GEOGRAPHY 
SET @Location = GEOGRAPHY::STPointFromText('POINT(73.9517061 40.7934358)',4326).STBuffer(5 * 1600); 
SELECT [fields] FROM [table] WHERE LocGeog.STIntersects(@Location) = 1 

(LocGeog es la columna de la Geografía)

Extrañamente, sin embargo, esto funciona MUCHO más lento que mi vieja consulta habitual (7 veces más lento), así que obviamente todavía estoy haciendo algo muy malo.

1

Sí, esto se puede hacer muy bien con los datos espaciales de SQL 2008. Existe cierta experiencia/prueba y error (?) En establecer la indexación espacial en el nivel de malla correcto, pero después de eso se supone que es genial (me la transmitieron amigos, no la he usado en producción).

para sus fines (latitud/longitud) que se wan la geo gráfico tipo y no la geo métrica .Creo que los índices espaciales configuraron un tipo de indexación de "triángulo delimitador anidado" que es una mejora sobre el tipo de preacondicionamiento de "cuadro delimitador" que estamos obligados a hacer en SQL sin él.

OK, sugiero comenzar en this post en el blog "Home of the Scary DBA" de Grant Fritchey (dile que te envié si quieres hacer preguntas :-)). Esta es una buena explicación de algunos análisis de rendimiento & ajuste de índices espaciales que estaba empezando a aprender y también incluye enlaces a muchos otros materiales.

5

Sí! Consulte this article sobre índices espaciales. Verá que estos tipos de índices funcionan mejor que el enfoque de "rectángulo indexado". Además, no solo podrá consultar eficazmente "es el punto cerca de otro punto", sino que realizará todo tipo de operaciones geográficas. Here's una lista completa de todos los métodos disponibles en el tipo.

0

sabes, yo estaba haciendo consultas Lat/longitud en Starbucks hace unos 5 años ...

y, básicamente, queríamos correlacionar las tiendas a los centros de distribución .. yo estaba trabajando en su departamento de operaciones, y Honestamente, no podía decir qué tienda era suministrada por un almacén en particular.

Así que terminé viniendo con este algoritmo de 'círculo mágico'.

básicamente, tenían un montón de consultas que se veía así: SELECT * FROM tabla1, tabla2 Dónde UdfDistance (table1.Lat, table1.Long, table2.Lat, table2.Long)> = 250

terminé dar con algo realmente similar, pero encontré mucho más rápido

sELECT * FROM tabla1, tabla2 Dónde UdfDistance (table1.Lat, table1.Long, table2.Lat, table2.Long)> = 250 y table1.Lat entre (tabla2.Lat - 1) y (tabla2.Lat + 1) y table1.Long entre (tabla2.Long - 1) y (tabla2.Long + 1)

Básicamente, no intente comparar dos puntos geográficos si hubiera más de 1 grado (lat y largo) de diferencia entre los dos.

En otras palabras, utilizó NORMAL INDICES RELACIONALES para filtrar muchos de los valores, y luego el cálculo de distancia UDF tenía MUCHA menos información para procesar.

Espero que ayude, intentaré ayudar a aclarar si necesito

Cuestiones relacionadas