1 votos

Optimización de la consulta de distancia mínima de PostGIS

Tengo el field_1 de mi Table_1 que debe tener la distancia mínima entre la geometría de mi Table_1 y cualquier geometría de mi Table_2 . Para ello, he utilizado un CROSS JOIN (Producto cartesiano completo) entre Table_1 y Table_2 . También he utilizado el operador KNN <-> .

Mi problema es que tardó más de 3 horas en ejecutarse y decidí abortar la consulta mientras se estaba ejecutando.

Table_1 a 56230 entidades.

Table_2 a 234843 entidades.

Aquí está mi código:

UPDATE Table_1
SET field_1 = list.distance
FROM(
    SELECT T1.gid AS name, MIN(T1.geom <-> T2.geom) AS distance
    FROM Table_1 AS T1
    CROSS JOIN Table_2 AS T2
    GROUP BY T1.gid
    ORDER BY T1.gid
     ) AS list
WHERE Table_1.gid = list.name;

¿Tienes alguna idea con una consulta más ligera que pueda ejecutar esto mucho más rápido? Ya he creado índices espaciales.

4voto

Braiam Puntos 120

El <-> utilizará el índice sólo si está dentro del order by cláusula.

Puede reescribir su consulta

select a.id,closest_pt.id, closest_pt.dist
from tablea a
CROSS JOIN LATERAL
  (SELECT
     id , 
     a.geom <-> b.geom as dist
     FROM tableb b
     ORDER BY a.geom <-> b.geom
   LIMIT 1) AS closest_pt;

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