Tôi có 2 bộ điểm trong 2 bảng riêng biệt. Table_a có 100k điểm và Table_b có 300k điểm. Tôi cố gắng tìm các điểm gần nhất trong mối quan hệ tìm cho tôi bất kỳ điểm nào từ bảng_b trong phạm vi 50 mét từ tabla_a. Sau cột tính toán đó, hãy nhóm chúng theo cột table_a a_id và trả về giá trị cao nhất.
Tôi đã viết một truy vấn sau đây đáp ứng criteira này
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;
Tôi đã thêm các chỉ mục hình học 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);
Tuy nhiên, vấn đề của tôi là tôi không thể thực hiện truy vấn để sử dụng chúng. Truy vấn kế hoạch là tiếp tục chọn quét chuỗi chậm. Tôi chạy một số thử nghiệm thay đổi _st_3ddwithin với st_3ddwithin , << - >> <50 , tạo bộ đệm 50 m và giao nhau , st_3ddistance <50 nhưng mọi người lập kế hoạch đều chọn quét theo trình tự. Có cách nào để sử dụng các chỉ mục có hiệu suất cao hơn hoặc thay đổi truy vấn để sử dụng các chỉ mục không?
Kế hoạch truy vấn của tôi:
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
là các hàm bên trong được PostGIS gọi sau khi lọc bằng một chỉ mục. Nếu bạn gọi họ trực tiếp, chỉ mục sẽ không được sử dụng.