私たちは、顧客のサブセットのそれぞれに最も近い顧客を取得しようとしています。私たちのSQLは期待通りに動作しますが、小規模なテストデータベース(4,000人の顧客、50個のサブセット)でも数秒かかりますが、明らかにデータベースサイズが大きくなるにつれて劇的に増加します。SQLで距離計算を改善する方法
select ... custA data, custB data
from customers custA
left join customers custB on custB.id=
(select custC.id
from customers custC
where custC.id<>custA.id
order by distance(custA.lat,custA.lon,custC.lat,custC.lon) asc limit 1)
where ... custA conditions
距離それが示唆:)
を確認するために名前だ、まさに計算する関数である、我々は同じ状態または類似の顧客のみを比較するので、フィルタのいくつかの種類を検索する...または置くことができますlatやlonのdiferenceの最大値などですが、SQL構造を改善する方法はありますか?
Thks
興味深い考えをありがとうが、初期の構文が改善されるわけではありません。私たちはそれをテストし、オリジナルの1.6倍から1.8倍の間を要します。一致する顧客のサブセットとして、関係は悪化します。 – DeepButi
私は私の答えを編集し、今はインデックス付きのビューを使用しています。私はこれがあなたのケースで使用できるのかどうかはわかりませんが、クエリーを実行するたびに顧客間の距離を計算するのにかかる時間はクエリを殺している可能性があります。索引付きビューでは、ビューが初めてマテリアライズされるときに発生します。 –
提案していただきありがとうございます。私たちはPostgressデータベースを使用しています。最も類似した概念はMATERIALIZEDビューです。マテリアライズド・ビューは、ソース表があるときにビュー・データが更新されないため、定期的なプロセスで明示的に再構築する必要があります。何千ものレコード(すべての顧客テーブルとのクロス・ジョイン)が含まれているため、本番システムで全体のビューを構築するために必要な時間はわかりません...試してみましょう。 – DeepButi