2009-08-28 11 views
7

Actualmente tengo un sitio con una tabla que tiene columnas flotantes Lat/Long, y un índice sobre esas 2 columnas más otra que necesito recuperar.¿Puedo crear un índice "Covering, Spatial" en SQL Server 2008?

Estoy constantemente consultando esta tabla para obtener las filas que caen dentro de un radio desde cierto punto (en realidad estoy obteniendo un cuadrado para la velocidad), pero solo necesito los campos que ya están indexados, por lo que este índice es, de hecho, cubierta, y el plan de ejecución sólo tiene 2 etapas:

Index Seek (cost: 100%) and SELECT (cost: 0%) 

Ahora, estoy tratando de tomar ventaja de las características espaciales de SQL 2008. he creado la columna de la Geografía, la llenó, creado el índice espacial, las obras.

Y todo funciona bien, excepto que el plan de ejecución tiene un millón de pasos, y el 74% del tiempo se usa en una búsqueda de índice agrupado, donde une las filas que encontró en el índice espacial con la tabla actual. para obtener el resto de los datos ...
(el índice espacial Seek lleva 1% del plan de ejecución de costes)

Así que, al parecer, se está utilizando el índice espacial adecuada y la búsqueda de los registros que necesitan mucho más rápido que antes con mi índice "regular" sobre Lat/Long, pero la unión a la tabla principal me está MATANDO, la consulta espacial toma 7 veces más que la anterior.

¿Hay alguna forma de agregar más columnas al índice espacial para que se cubra y pueda hacer las cosas en un solo paso, tal como lo hacía antes?
¿Hay otras cosas que podría hacer para mejorar esta situación?


ACTUALIZACIÓN: He encontrado que los índices "normales" pueden "incluir" otras columnas usando la palabra clave INCLUDE (que yo no sabía nada, solía basta con incluir las columnas en el propio índice)
acuerdo a la documentación here, esa cláusula no es una opción para índices espaciales ... ¿Alguna idea?

Gracias!
Daniel

Respuesta

4

Desafortunadamente, actualmente no hay forma de crear un índice espacial de cobertura; la consulta siempre realizará la búsqueda de marcador en la tabla base para obtener el valor de la geografía de la fila.

Para STIntersects, esto siempre es necesario, ya que todavía tenemos que realizar el filtro secundario en el objeto de geografía real para verificar que se cruza con el objeto de parámetro. Sin embargo, si no necesita respuestas exactas y puede usar Filter(), entonces sería posible proporcionar las columnas de clave primaria desde el índice sin hacer la búsqueda hasta la tabla base. Apoyar esto es algo que estamos considerando para el próximo lanzamiento.

En términos de agilizar su consulta actual, ¿ha intentado utilizar Filter() y ajustar su índice con la salida de sp_help_geography_index?

Cuestiones relacionadas