Tengo una gran base de datos llena de clientes, implementada en el servidor SQL 2005. Cada cliente tiene una latitud y longitud, representadas como Decimal(18,15)
. La consulta de búsqueda más importante de la base de datos intenta encontrar todos los clientes cerca de un lugar determinado de esta manera:¿Qué tan bueno es el tipo de datos de geografía en el servidor sql 2008?
(Addresses.Latitude - @SearchInLat) BETWEEN -1 * @LatitudeBound AND @LatitudeBound)
AND ((Addresses.Longitude - @SearchInLng) BETWEEN -1 * @LongitudeBound AND @LongitudeBound)
Por lo tanto, este es un método muy simple. @LatitudeBound
y @LongitudeBound
son solo números, utilizados para retirar a todos los clientes dentro de un rectángulo delimitador aproximado del punto @SearchInLat, @SearchInLng
. Una vez que los resultados llegan a la PC del cliente, algunos resultados se filtran para que haya un círculo delimitador en lugar de un rectángulo. (Esto se hace en la PC del cliente para evitar el cálculo de raíces cuadradas en el servidor).
Este método ya funcionó bastante bien en el pasado. Sin embargo, ahora queremos hacer que la búsqueda haga más cosas interesantes, por ejemplo, tener la cantidad de resultados retraídos sea más predecible, o para que el usuario aumente dinámicamente el tamaño del radio de búsqueda. Para hacer esto, he estado buscando la posibilidad de ugprading al servidor sql 2008, con su tipo de datos Geography, índices espaciales y funciones de distancia. Mi pregunta es esta: ¿qué tan rápido son estos?
La ventaja de la consulta simple que tenemos en este momento es que es muy rápida y no requiere mucho rendimiento, lo cual es importante ya que se llama con mucha frecuencia. ¿Qué tan rápido sería una consulta basada en algo como esto:
SearchInPoint.STDistance(Addresses.GeographicPoint) < @DistanceBound
ser por comparación? ¿Funcionan bien los índices espaciales y es rápida la distancia ST?