2つの異なるテーブルで2セットのポイントを取得しました。Table_aは100kポイント、table_bは300kポイントを獲得しました。関係で最も近いポイントを見つけようとすると、tabla_aから50メートル以内にあるtable_bからポイントが見つかります。その秋の列を計算した後、それらをtable_a a_id列でグループ化し、最高値を返します。
私はこの批評家を満たす次のクエリを書きました
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;
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);
しかし、私の問題は、それらを使用するためのクエリを作成できないことです。クエリプランナーは、遅いシーケンススキャンを選択し続けています。_st_3ddwithinをst_3ddwithin、<<->> <50で変更するテストを実行し、50 mのバッファーと交差を作成します。st_3ddistance<50ですが、プランナーがシーケンススキャンを選択するたびに、より高いパフォーマンスでインデックスを使用する方法、またはインデックスを使用するようにクエリを変更する方法はありますか?
私のクエリプラン:
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
は、インデックスでフィルタリングした後にPostGISによって呼び出される内部関数です。それらを直接呼び出す場合、インデックスは使用されません。