Eu tenho 2 conjuntos de pontos em 2 tabelas separadas. A tabela_a obteve 100k pontos e a tabela_b obteve 300k pontos. Estou tentando encontrar os pontos mais próximos em relação a qualquer ponto da tabela_b que esteja a 50 metros da tabela_a. Depois disso, calcule a coluna de queda, agrupe-as pela tabela_a coluna a_id e retorne o valor mais alto.
Eu escrevi uma consulta a seguir que atende essa criteira
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;
Adicionei índices de geometria 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);
No entanto, meu problema é que não consigo fazer a consulta para usá-los. A plaina de consulta continua escolhendo a varredura de sequência lenta. Executo alguns testes alterando _st_3ddwithin com st_3ddwithin , <<->> <50 , criando buffer de 50 me interceptando , st_3ddistance <50, mas sempre que o planejador está escolhendo a varredura de sequência. Existe uma maneira de usar índices com desempenho superior ou alterar a consulta para usar índices?
Meu plano 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
são funções internas chamadas pelo PostGIS após a filtragem com um índice. Se você chamá-los diretamente, o índice não será usado.