Mi tabla de puntos tiene 246,338 características y la tabla de polígonos tiene 43,957 características. Estoy relacionando los valores de un atributo de los polígonos para actualizar una columna en la tabla de puntos.
Esta pregunta es similar a Speed up point sampling with ST_Value function in PostGIS, raster/vector overlay pero esa pregunta aborda específicamente el muestreo de puntos de ráster, no polígonos, utilizando ST_Value, y el tamaño óptimo de almacenamiento de mosaicos de ráster.
Ambas tablas han tenido mantenimiento realizado y tienen índices espaciales que están actualizados. Los polígonos son registros de tasas de aplicación de fertilizantes aplicadas a un campo y son bastante desordenados con muchos superpuestos:
La tabla de polígonos ha sido comprobada para geometrías inválidas y estas han sido corregidas. Al correr ST_NPoints me dice que hay un promedio de solo 5 vértices por polígono así que ST_Simplify no es necesario. El tamaño promedio del polígono es de 112 m2 y van desde 0 (solo 60 de ellos) hasta 826 m2. No puedo disolver (ST_Union) polígonos en nada porque necesito los valores numéricos únicos de fertilizante de esos polígonos individuales.
He intentado dos consultas en PostGIS, pero las he abandonado después de ejecutarlas durante unas horas:
Consulta 1:
update puntos
set tasa_fert = tasa
from puntos a, polígonos b
where st_intersects(a.geom, b.geom);
Consulta 2:
with muestra_punto as (
select tasa
from puntos a, polígonos b
where st_intersects(a.geom, b.geom)
)
update puntos
set tasa_fert = muestra_punto.tasa
from muestra_punto;
Tener a QGIS leyendo las tablas desde la base de datos y corriendo la herramienta de 'muestreo de puntos' solo toma un par de minutos. Sin embargo, esta no es la solución óptima por muchas razones, particularmente porque la salida debe ser guardada como un shapefile, los encabezados se truncan a 10 caracteres, y luego deben ser importados nuevamente a la base de datos, nombres de encabezado corregidos, etc.
Mis preguntas son:
- ¿Qué está haciendo QGIS en su algoritmo que yo no tengo en mi consulta?
- ¿Cómo puedo incorporar esa ventaja en mi enfoque para no tener que salir fuera de mi base de datos?
Me gustaría mantener cualquier sugerencia/solución dentro de PostGIS/QGIS.
Estoy usando PostGIS 2.4.1 y QGIS 2.18.14 en un equipo Windows 10.
EDIT: En respuesta a los comentarios de John Powell y Thingamubob, ejecuté EXPLAIN ANALYZE en las dos consultas anteriores. Ambas tablas tuvieron un vacuum/analyze realizado justo antes de correr EXPLAIN ANALYZE. Aquí está la salida para el resultado de la primera consulta:
Y aquí está la salida de la segunda consulta, la que utiliza el CTE:
Cada una de estas consultas EXPLAIN ANALYZE tomó alrededor de una hora para ejecutarse.
0 votos
Para este tipo de pregunta, es esencial incluir la salida de EXPLAIN. De lo contrario, es solo una suposición. Suena mucho como si el índice espacial no estuviera siendo utilizado, sin embargo, dadas las diferencias de rendimiento entre QGIS y Postgis.
0 votos
En QGIS, Processing puede generar otro formato que no sea shapefile. Especialmente en QGIS 3, podría ser aún más rápido debido al cambio a C++ de Processing.
0 votos
@Gustry, ¿puedes por favor explicar cómo se hace esto? Sé que algunas herramientas permiten la salida de un archivo temporal. Esto sería ideal, ya que podría empujar fácilmente eso de nuevo a mi base de datos postgis sin los problemas intermedios de guardarlo como un shapefile. Esta herramienta de "muestreo de puntos" en particular solo permite una opción de salida, que es un shapefile.
0 votos
Tus consultas están creando múltiples conjuntos de registros por punto para cada polígono con el que intersecta y no filtra un valor de retorno único para el comando
SET
; es decir, crea un sobrecosto exhaustivo con registros no optimizados, además de resultados incorrectos. Dado el ajuste adecuado, ejecuto actualizaciones similares en el doble de filas en computadoras menos equipadas en menos de un minuto. También asumo que los índices no se están utilizando adecuadamente (¿ejecutaste, por ejemplo,`VACUUM ANALYZE en ambas tablas?). Para poder validar, sin embargo, debes proporcionar el resultado de
EXPLAIN ANALYZE`...
0 votos
@JohnPowellakaBarça He editado la pregunta para incluir la salida de EXPLAIN ANALYZE. Cualquier idea sería muy apreciada.
0 votos
@ThingumaBob, He editado la pregunta para incluir la salida de EXPLAIN ANALYZE. Cualquier comentario sería muy apreciado.