Tengo una tabla PostgreSQL, con casi 2 millones de filas, con un coordinates
campo largo en el formulario POINT(-73.4938 33.2405)
.
Suponiendo que haya un índice geoespacial en ese campo, ¿cuál es la forma más eficiente y rápida de seleccionar todas las filas dentro de un cuadro de límite arbitrario?
El cuadro es como SW long-lat: -74.0042 40.7688
, NE long-lat: -73.8809 40.7984
.
postgis
performance
geography-data-type
Avishai
fuente
fuente
Respuestas:
Suponiendo que los límites del cuadro delimitador dados están en el mismo sistema de referencia espacial que las coordenadas almacenadas, y usted sabe qué operador espacial (interseca o contenido) necesita:
Alternativamente, si prefiere el sonido de "contiene" (en lugar de "contenido por"), la
WHERE
cláusula debería cambiarse:PD: Dado (por OP después de que se publicó lo anterior) que los registros son puntos simples, creo que la diferencia entre "intersecciones" y "contención" se vuelve muy sutil, afectando solo los puntos en los bordes del cuadro delimitador.
fuente
What's the fastest ...?
: OP&&
y@
parece que no funciona cuando se cruza con la geometría del polígono. En este caso, useST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))
o alternativamenteST_Contains
fuente
Aparentemente, no tengo suficientes puntos para agregar un comentario, así que estoy usando esta respuesta solo para decir que probé tanto ST_MakeEnvelope versus la comparación matemática de "x> min_x y x <max_x e y> min_y e y <max_y". ..en promedio ST_MakeEnvelope tardó 60 ms y la comparación matemática tardó 155 ms en mi consulta particular de bbox.
¡Entonces la búsqueda espacial ST_MakeEnvelope debería ser más rápida que la comparación matemática!
fuente
INDEX
sobre ST_MakeEnvelope y (ST_XMax, ST_XMin, ST_YMax, ST_YMin) y la diferencia es muy favorable a las matemáticas. Las matemáticas me tomaron menos de 20 segundos (ÍNDICE + Consulta), mientras que la intersección de la envoltura tardó más de 2 minutos (me di por vencido cuando llegó a 2 minutos, 40