ポリゴンクエリの非常に大きなポイントを最適化する
住所ポイントの全国データセット(3700万)とタイプMultiPolygonZの洪水アウトライン(200万)のポリゴンデータセットがあります。一部のポリゴンは非常に複雑で、最大ST_NPointsは約200,000です。PostGIS(2.18)を使用してフラッドポリゴンにあるアドレスポイントを特定し、これらをアドレスIDとフラッドリスクの詳細を含む新しいテーブルに書き込もうとしています。アドレスの観点(ST_Within)から試してみましたが、洪水地域の観点(ST_Contains)から始めてこれを入れ替えました。根拠は、洪水のリスクのない大きな地域があることです。両方のデータセットが4326に再投影され、両方のテーブルに空間インデックスがあります。以下の私のクエリは3日間実行されており、すぐに終了する兆候はありません! select a.id, f.risk_factor_1, f.risk_factor_2, f.risk_factor_3 into gb.addresses_with_flood_risk from gb.flood_risk_areas f, gb.addresses a where ST_Contains(f.the_geom, a.the_geom); これを実行するより最適な方法はありますか?また、このタイプのクエリを長時間実行する場合、リソース使用率とpg_stat_activityを確認する以外に、進行状況を監視する最良の方法は何ですか? 私の元のクエリは3日間で問題なく終了し、他の作業に追われたため、ソリューションを試すために時間を費やす必要がなくなりました。しかし、私はこれを再検討し、推奨事項を検討したところ、これまでのところ良好です。私は以下を使用しました: ここで提案されているST_FishNetソリューションを使用して、英国上空に50 kmのグリッドを作成しました 生成されたグリッドのSRIDをBritish National Gridに設定し、それに空間インデックスを構築しました ST_IntersectionとST_Intersectsを使用してフラッドデータ(MultiPolygon)をクリップしました(ここで問題になるのは、shape2pgsqlがZインデックスを追加したときに、gemでST_Force_2Dを使用する必要があったことだけです) 同じグリッドを使用してポイントデータをクリップしました 行に作成されたインデックス、各テーブルにcolと空間インデックス これでスクリプトを実行する準備ができました。国全体をカバーするまで、結果を新しいテーブルに移入する行と列を繰り返し処理します。しかし、洪水データを確認したところ、非常に大きなポリゴンのいくつかが翻訳中に失われたようです!これは私のクエリです: SELECT g.row, g.col, f.gid, f.objectid, f.prob_4band, ST_Intersection(ST_Force_2D(f.geom), g.geom) AS geom INTO rofrse.tmp_flood_risk_grid FROM rofrse.raw_flood_risk f, rofrse.gb_grid g WHERE (ST_Intersects(ST_Force_2D(f.geom), g.geom)); 私の元のデータは次のようになります: ただし、ポストクリッピングは次のようになります。 これは、「欠けている」ポリゴンの例です。