Ich habe 2 Sätze von Punkten in 2 separaten Tabellen. Table_a hat 100.000 Punkte und table_b hat 300.000 Punkte. Wenn ich versuche, die nächsten Punkte in Bezug zu finden, finde ich einen beliebigen Punkt aus table_b, der sich innerhalb von 50 Metern von tabla_a befindet. Nachdem Sie die Fallspalte berechnet haben, gruppieren Sie sie nach der Spalte table_a a_id und geben den höchsten Wert zurück.
Ich habe eine folgende Abfrage geschrieben, die diese Kriterien erfüllt
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;
Ich habe 3D-Geometrieindizes hinzugefügt:
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);
Mein Problem ist jedoch, dass ich keine Abfrage machen kann, um sie zu verwenden. Der Abfrageplaner wählt weiterhin einen langsamen Sequenzscan. Ich führe einen Test durch, bei dem _st_3ddwithin mit st_3ddwithin , <<- >> <50 geändert wird , wobei 50 m Puffer erstellt und st_3ddistance <50 geschnitten werden , aber jedes Mal, wenn der Planer den Sequenzscan wählt. Gibt es eine Möglichkeit, Indizes mit höherer Leistung zu verwenden oder die Abfrage so zu ändern, dass Indizes verwendet werden?
Mein Abfrageplan:
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
sind interne Funktionen, die von PostGIS nach dem Filtern mit einem Index aufgerufen werden. Wenn Sie sie direkt aufrufen, wird der Index nicht verwendet.