J'ai obtenu 2 ensembles de points dans 2 tableaux distincts. Table_a a obtenu 100 000 points et table_b a obtenu 300 000 points. J'essaie de trouver les points les plus proches par rapport me trouver n'importe quel point de table_b qui est à moins de 50 mètres de tabla_a. Après avoir calculé la colonne d'automne, regroupez-les par colonne table_a a_id et retournez la valeur la plus élevée.
J'ai écrit une requête suivante qui répond à cette 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;
J'ai ajouté des index de géométrie 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);
Cependant, mon problème est que je ne peux pas faire de requête pour les utiliser. Le planificateur de requêtes continue de choisir un balayage de séquence lent. Je lance un test en changeant _st_3ddwithin avec st_3ddwithin , <<->> <50 , en créant 50 m de tampon et en intersectant , st_3ddistance <50 mais à chaque fois le planificateur choisit le balayage de séquence. Existe-t-il un moyen d'utiliser des index avec des performances supérieures ou de modifier la requête pour utiliser des index?
Mon plan de requête:
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
sont des fonctions internes appelées par PostGIS après filtrage avec un index. Si vous les appelez directement, l'index ne sera pas utilisé.