問題タブ [geodesic-sphere]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 多くの経度/緯度間の最短距離を効率的に計算するにはどうすればよいですか (Oracle SQL)?
タイトルが示すように、多くの経度と緯度のポイント セット間の最短距離を計算しようとしています。家のセットと店舗のセットがあります。各家について、半径 20 マイル以内で最も近い店舗を特定しようとしています。
私が書いた SQL は機能しますが、実行にホームを追加するとうまくスケーリングしません。この計算を効率的に行う方法を見つけようとしています。実行に数時間かかる場合でも、これを月単位で実行できるので、満足しています。ただし、現状では、このクエリをデータベース内のすべての家に対して実行すると、数日間実行されます。
これまでに試したこと
- この質問のガイダンスを使用して、Oracle の SDO_GEOM パッケージを使用して距離計算を実行しました。
- 効率性の観点から、このガイドの推奨事項に従って、経度/緯度の各列にインデックスを設定し、where 節でコードを作成して半径 20 マイルに制限し、無効な経度/緯度をすぐに除外しようとしました。これにより、余分な計算が削減されます。
- クエリに並列処理を追加することはできますが、これは実行時間を短縮する強引な方法であると感じています。並列処理を追加することは実行可能だと思いますが、プロセッサを投入する前にクエリを効率的に実行するソリューションに到達したいと考えています。
データ設定
私は、2 つのデータセットを持つ Oracle 19c データベースに取り組んでいます。
1. HOME_ID とそれに関連付けられた経度と緯度のリスト
このリストは、サイズが数十万のレコードになる可能性があります。
長緯度の列ごとにインデックスが設定されます。
2. STORE_ID とそれに関連付けられた経度と緯度のリスト
このリストのサイズは、およそ 1,000 レコードです。
長緯度の列ごとにインデックスが設定されます。
クエリ
このクエリは、少数のレコードに対して実行するとうまく機能します。残念ながら、作業データのかなりの部分でテストすると、実行に数時間かかります。このクエリを大幅に高速化するには、どのような変更またはトリックを採用できますか?
ノート
現在の状態のクエリは、半径 20 マイル以内の HOME_ID に関連付けられたすべての STORE_ID を返します。次のステップは、出力を各 HOME_ID の距離で並べ替え、店舗までの距離が最も短いレコードを選択することです。参考までに、そのクエリは次のようになります。