Tengo una consulta PostGIS que devolverá varios millones de filas:
SELECT
t1.id AS id1,
t2.id AS id2,
ABS(t1.mean_h - t2.mean_h) AS h_diff,
ST_Distance(t1.the_geom, t2.the_geom) AS dist
FROM tas_ponds as t1, tas_ponds as t2
WHERE
(t1.gid > t2.gid) AND
ST_DWithin(t1.the_geom, t2.the_geom, 17000)
Cuando corro psql
, me sale un out of memory for query result
error.
Google sugiere que este es un error dentro de psql en lugar de postgres / PostGIS. ¿Enmendar la consulta en el formulario SELECT ... INTO x FROM ...
solucionaría el problema? ¿Existen otros enfoques recomendados para tratar con conjuntos de datos muy grandes?
fuente
Para el registro, en mi caso, el almacenamiento del conjunto de datos devuelto en otra tabla utilizando la
SELECT ... INTO ...
sintaxis funcionó.No solo resolvió el problema de falta de memoria, sino que también fue sustancialmente más rápido que la consulta original.
fuente
La indexación es muy importante en Postgres y PostGIS
http://postgis.refractions.net/docs/ch04.html#id2794434
Recomendar índices GiST (árboles de búsqueda generalizados) para conjuntos de datos muy grandes ... (también es "nulo seguro") ejemplo CREATE INDEX [indexname] ON [tablename] USANDO GIST ([geometryfield]);
Después de crear un índice, es importante forzar a PostgreSQL a recopilar estadísticas de tabla, que se utilizan para optimizar los planes de consulta
ANÁLISIS DE VACÍO [nombre_tabla] [nombre_columna]; SELECT UPDATE_GEOMETRY_STATS ([nombre_tabla], [nombre_columna]);
También una buena referencia es: Aprovechar los índices http://postgis.refractions.net/docs/ch04.html#id2794685
fuente