Saya mendapat 2 set poin dalam 2 tabel terpisah. Table_a mendapat 100rb poin dan table_b mendapat 300rb poin. Saya mencoba menemukan titik terdekat dalam kaitannya menemukan saya titik dari table_b yang berjarak 50 meter dari tabla_a. Setelah itu hitung kolom jatuh, kelompokkan dengan table_a a_id kolom dan kembalikan nilai tertinggi.
Saya menulis pertanyaan berikut yang memenuhi criteira ini
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;
Saya menambahkan indeks geometri 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);
Namun masalah saya adalah bahwa saya tidak dapat membuat permintaan untuk menggunakannya. Query planer terus memilih pemindaian urutan yang lambat. Saya menjalankan beberapa pengujian mengubah _st_3ddwithin dengan st_3ddwithin , <<->> <50 , membuat buffer 50 m dan memotong , st_3ddistance <50 tetapi setiap perencana memilih pemindaian urutan. Apakah ada cara untuk menggunakan indeks dengan kinerja lebih tinggi atau mengubah kueri untuk menggunakan indeks?
Paket kueri saya:
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
fungsi internal yang dipanggil oleh PostGIS setelah difilter dengan indeks. Jika Anda memanggil mereka secara langsung, indeks tidak akan digunakan.