7 votos

Índice espacial frente a índices de dos coordenadas

Tengo una tabla con dos columnas: latitud y longitud. Quiero obtener todos los objetos que estén dentro de un cuadro delimitador "rectangular" (bueno, rectangular en una métrica de coordenadas lat/lon): latitud mín-máx y longitud mín-máx. Básicamente, esto se reduce al siguiente pseudo-SQL:

SELECT * FROM MyTable WHERE lat < :maxlat AND lat > :minlat 
    AND lon < :maxlon AND lon > :minlon

¿Cuál es la mejor solución para indexar mi tabla? ¿Un índice de dos columnas? ¿Dos índices sobre las dos columnas? ¿Un índice espacial?

Me gustaría saber si realmente es necesario un índice espacial en ese caso, ya que se necesita una columna especial, librerías específicas, todo eso a costa de la portabilidad y simplicidad de la base de datos.

Puedo garantizar que sólo realizaré este tipo de consultas espaciales. Y ya dispongo de funciones para calcular la distancia ortodrómica entre dos puntos (función Haversine), así que no necesito una base de datos con capacidad espacial. En cuanto a cruzar el Pacífico, está fuera de la zona cubierta (pero podría ser fácilmente manejado por una pequeña prueba que cambiar minlon y maxlon).

Nota: Me gustaría mantener esta pregunta agnóstica de la base de datos, pero en aras de la integridad menciono el hecho de que estoy trabajando con PostGreSQL 8, sin (por ahora) PostGIS.

4voto

Celso Puntos 66

Un índice estándar de árbol b de varias columnas en las dos columnas es probablemente la solución más eficaz siempre que:

  1. ambos se utilizan conjuntamente en la expresión where. Un índice de varias columnas no se utilizará cuando sólo esté presente la segunda columna

Un índice de varias columnas es más eficiente que dos índices en ambas columnas porque utilizará menos almacenamiento y será menos costoso de actualizar cuando la tabla cambie (sólo un índice que actualizar frente a dos).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X