Soy un novato en postgis y tengo un problema en el rendimiento de las consultas.
Esta es mi consulta:
SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp
FROM table1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),position)
ORDER BY userid, timestamp desc
y el problema es que mi multipolígono incluye polígonos MUY grandes (¡600 páginas de largo en word doc!) y tardó más de 2 horas en ejecutarse!
¿Hay alguna forma de optimizar mi consulta o usar otra forma?
Por favor, su ayuda es muy apreciada!
Depende de qué tipo de calidad: precisión necesita. Obviamente, puede simplificar los polígonos usando: http://postgis.net/docs/ST_Simplify.html
Lo que hice a menudo durante el desarrollo de mi aplicación SIG fue pensar en la mejor manera de minimizar los datos. P.ej. preseleccione los polígonos dentro del cuadro de límite, por ejemplo. - Dependiendo del nivel de zoom, no necesita resultados ultra precisos (st_simplify), etc.
¡Espero que te haya ayudado un poco!
fuente
Dependiendo de su experiencia en postgres y / o sql, tiene varias opciones:
analice la consulta a través del comando EXPLICAR para averiguar si está llegando a un cuello de botella en particular. Advertencia: a veces la salida de EXPLAIN puede ser difícil de entender
si espera que la mayoría o una parte significativa de las geometrías en la tabla 1 NO se crucen con el multipolígono, puede intentar aplicar una condición preliminar contra un polígono más simple (es decir, al romper el multiploygon en piezas más pequeñas) y luego ejecutar la intersección multipolígono más pesada solo en esos resultados Vea a continuación un ejemplo.
si y sólo si la CPU es el cuello de botella (es decir, el servidor es intersecciones de computación atascados) Me debidamente sugiero que conseguir una más grande, más rápido, CPU más potente o alquilar una sola vez de alta CPU Instancia fuera EC2 de Amazon y lo destruyen cuando estás hecho
Ejemplo de consulta para el ítem 2:Para mejorar el rendimiento, también podría materializar temporalmente la subselección st1 como una tabla para poder indexarla.@Nicklas tiene razón al señalar en los comentarios que el ejemplo de la sugerencia 2 no debería ayudar. Tiene razón, pero creo que yo también estoy (en parte) en lo cierto.
De hecho, parece que se hizo una pregunta muy similar (y se respondió) en noviembre pasado sobre el ML postgis:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
y resulta que la sugerencia es dividir realmente el polígono para que el índice pueda filtrar de manera más efectiva las intersecciones falsas que de otra manera serían activadas por una simple verificación de límites.
fuente
UtilizandoST_SubDivide()
Para la versión 2.2 de Postgis, puede usar
ST_SubDivide
.Puede también
Aquí usamos
ST_SubDivide
para dividir el polígono en subpolígonos con 10 o menos vértices.Entonces
No haga lo anterior, presenta errores de redondeo
Afinación general
También mire la sección titulada Consejos de rendimiento en los documentos. Asegúrate de estar sintonizado adecuadamente. Considere subir
max_parallel_workers_per_gather
para aprovechar la paralelización (actualmente, por defecto, está desactivado).fuente