ポイントテーブルに1億5,000万のポイントがあり、特定のポリゴンジオメトリの外側にあるいくつかのポイントを見つけたいと考えています。ポイントの99.9%がポリゴンジオメトリ内にあることを知っています。ポリゴンの外側にあるいくつかのポイントを見つけることに興味があります。
インデックス付きのPostGISテーブルを使用した現在の最良のクエリは、完了するまでに約30分かかります。ほとんどのポイントがポリゴン(境界線)内にあることを知っている次のクエリを最適化する方法はありますか?
SELECT COUNT(*) 
FROM italy_points pt
JOIN borders poly
ON ST_WITHIN (pt.the_geom, poly.geom)
WHERE poly.iso3 = 'ITA'; 
ポリゴンは基本的にイタリアの管理0境界です。頂点-405,000。パーツ-510。エンベロープはポリゴンよりもはるかに大きい(ポリゴンはエンベロープの24%をカバーしています)
                
                2
              
                  質問を編集して、ポリゴンの複雑さを示してください-パーツの数はいくつですか?頂点の数は?ポリゴンのエンベロープの何パーセントがポリゴン内にあるか。複雑なポリゴンを分割するとポイントインポリゴンの評価が向上することがわかりましたが、1つのポイントが複数のパーティションと交差する条件を処理する必要があります。
                
                
                  
                    —
                    Vince 
                    
                  
                
              
                  このタイプの操作の最初の最適化は、完全なポリゴン内ポイント操作に進む前に、ポイントがポリゴンのバウンディングボックス内にあるかどうかを確認することです。比較すると、ポイントインボックスは非常に効率的な操作です。
                
                
                  
                    —
                    WhiteboxDev 2018 
                    
                  
                
              
                  @Vince重複が可能である場合(考えられる唯一のケースは、2つのパーティションの境界に正確に一致する場合です)、これはPostGISで簡単に処理されます。
                
                  
                    —
                    jpmc26 
                    
                  
                
              GROUP BYポイントの主キーだけが必要です。(PostgreSQLではSELECT、主キーがGROUP BY句に含まれているテーブルに由来する句の列を便利に参照できます。)
                
                  @WhiteboxDev 
                
                  
                    —
                    jpmc26 2018 
                    
                  
                
              ST_Withinは、インデックスの使用を可能にする境界ボックスチェックをすでに実行しています。(PostGISのほとんどすべての機能にこの最適化が含まれています。)それでも遅い場合は、明らかに問題はポリゴンの複雑さにあります。
                
                  @ jpmc26もちろん、内部境界条件に確実に一致しないため
                
                  
                    —
                    Vince 
                    
                  
                
              ST_Intersects、SQLクエリもを使用するように変更する必要がありST_Withinます。