2つのテーブルがあり、どちらにもXY座標のオブジェクトが含まれています。
表A:
ID_A | X | Y
-----|------|------
100 | 32.2 | 25.6
101 | 36.2 | 22.1
102 | 31.7 | 39.2
103 | 42.7 | 15.6
104 | 24.5 | 29.9
表B:
ID_B | X | Y
-----|------|------
200 | 55.3 | 25.1
201 | 21.5 | 54.2
202 | 67.3 | 66.6
203 | 23.5 | 55.4
204 | 41.1 | 24.5
205 | 42.4 | 62.6
206 | 26.8 | 23.6
207 | 63.2 | 25.6
208 | 35.6 | 11.1
209 | 74.2 | 22.2
210 | 12.2 | 33.3
211 | 15.7 | 44.4
テーブルAの各オブジェクトについて、テーブルBで最も近いオブジェクトを見つけたいと思います(オブジェクト間の距離は最小です)。したがって、結果は次のようになります(距離はここではランダムです...):
ID_A | ID_B | DISTANCE
-----|------|---------
100 | 203 | 12.5
101 | 203 | 11.1
102 | 211 | 16.5
103 | 205 | 14.2
104 | 209 | 17.7
オブジェクト間の距離:
SQRT( (A.X-B.X)*(A.X-B.X) + (A.Y-B.Y)*(A.Y-B.Y) )
だから私はこのクエリを行いました:
SELECT DISTINCT A.ID_A
, FIRST_VALUE (B.ID_B) OVER (PARTITION BY A.ID_A ORDER BY SQRT((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y)) ASC) AS ID_B
, FIRST_VALUE (SQRT((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y))) OVER (PARTITION BY A.ID_A ORDER BY SQRT((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y)) ASC) AS DISTANCE
FROM TableA A, TableB B
正常に機能しますが、問題は、両方のテーブルに大量の行(500kを超える)があり、このクエリがかなり遅い(そしておそらく非常に非効率的)ことです。
このクエリを最適化する方法は?(私はOracle SQLを使用しています)よろしくお願いします。