Obtuve 2 conjuntos de puntos en 2 tablas separadas. Table_a obtuvo 100k puntos y table_b obtuvo 300k de puntos. Intento encontrar los puntos más cercanos en relación, encuéntrame cualquier punto de table_b que esté dentro de los 50 metros de tabla_a. Después de calcular la columna de caída, agrúpelos por table_a a_id columna y devuelva el valor más alto.
Escribí una siguiente consulta que cumple con este criterio
SELECT DISTINCT ON (a_id) *
FROM (
SELECT
table_b.b_id,
table_b.height - st_3ddistance(table_b.geom, table_a.geom) fall,
table_b.geom,
table_a.a_id
FROM table_a
INNER JOIN table_b ON _st_3ddwithin(table_a.geom, table_b.geom, 50)) a
WHERE fall >= 0
ORDER BY a_id, fall DESC;
Agregué índices de geometría 3d:
CREATE INDEX table_a_geom ON table_a USING GIST (geom gist_geometry_ops_nd);
CREATE INDEX table_b_geom ON table_b USING GIST (geom gist_geometry_ops_nd);
Sin embargo, mi problema es que no puedo hacer una consulta para usarlos. El planeador de consultas es seguir eligiendo la exploración de secuencia que es lenta. Ejecuto algunas pruebas cambiando _st_3ddwithin con st_3ddwithin , <<->> <50 , creando 50 m de búfer e intersección , st_3ddistance <50 pero cada vez que el planificador elige la exploración de secuencia. ¿Hay alguna manera de usar índices con mayor rendimiento o cambiar la consulta para usar índices?
Mi plan de consulta:
Unique (cost=10462593.70..10473018.43 rows=1 width=144)
-> Sort (cost=10462593.70..10467806.06 rows=2084945 width=144)
Sort Key: table_a.nmbayuid, ((table_b.height - st_3ddistance(table_b.geomgr, table_a.geom))) DESC
-> Nested Loop (cost=0.00..10243762.28 rows=2084945 width=144)
Join Filter: (_st_dwithin(table_a.geom, table_b.geomgr, '50'::double precision) AND ((table_b.height - st_3ddistance(table_b.geomgr, table_a.geom)) >= '0'::double precision))
-> Seq Scan on table_b (cost=0.00..1459.47 rows=47147 width=96)
-> Materialize (cost=0.00..10.97 rows=398 width=56)
-> Seq Scan on table_a (cost=0.00..8.98 rows=398 width=56)
_ST
son funciones internas llamadas por PostGIS después de filtrar con un índice. Si los llama directamente, no se usará el índice.