2013-06-18 7 views
2

이것은 두 테이블로 표시된 네트워크입니다. P 테이블에는 소스 노드와 해당 좌표가 있습니다. 이 표에는 약 8M 개의 레코드가 있습니다.가장 가까운 대상을 찾는 가장 빠른 방법

PID  | x | y  | ClosestG 
XFEW134 | 30.3 | -20.1 | 
ABCEFO1 | 10.1 | 1.1 | 

G 테이블에는 각 P 소스 노드와 관련된 대상 노드 (및 해당 좌표)가 있습니다. 이 테이블에는 약 24k가 있습니다.

PID  | GID | x | y 
XFEW134 | 431 | -10.3 | -13.2 
XFEW134 | 123 | 31.3 | -10.3 
XFEW134 | 251 | 22.5 | 100.1 
ABCEFO1 | 521 | 99  | -75.4 
ABCEFO1 | 431 | -10.3 | -13.2 

나는 각각의 P의 가장 가까운 G 노드를 찾아 GID와 P 테이블의 ClosestG 필드를 입력하는 가장 빠른 방법을 찾고 싶어요. 감사.

+0

가 어떻게 거리를 계산합니다? 그 전적으로 가능한, 실제로 가능성이있는, 거기에 몇 가지 관계가있을 수 있습니다. 이렇게? http://www.mathopenref.com/coorddist.html – Jodrell

+0

아, 나는 P와 G 사이의 좌표에 피타고라스의 정리를 사용합니다. – John

+0

모든 G에는 PID가 있습니다. 동일한 PID에 속한 G 만이 자격이됩니까? 또는 동일한 PID에 속하는 G를 배제하고 싶습니까? 또는 다른 것? –

답변

2

글쎄,이 일 것

그것은 G 관련 각 각 P의 거리의 크기를 계산합니다. 그런 다음 가장 낮은 크기의 G 만 선택합니다.

실제로 거리를 원하지 않는 한 SQRT 기능을 사용할 필요는 없습니다.

WITH [ByDistance] AS 
(
SELECT 
      P.[PId], 
      G.[GId], 
      ROW_NUMBER() OVER(PARTITION BY P.[PId] ORDER BY 
      (SQUARE(G.[x] - P.[x]) + 
       SQUARE(G.[y] - P.[y])) ASC) RowOrder 
    FROM 
      [P] 
     JOIN 
      [G] 
       ON G.[PId] = P.[PId] 

) 
SELECT 
      P.[PId], 
      P.[x], 
      P.[y], 
      D.[GId] [ClosetG] 
    FROM 
      [ByDistance] D 
     JOIN 
      [P] 
       ON P.[PId] = D.[PId] 
    WHERE 
      RowOrder = 1; 

Fiddle Here

예 출력 : (테스트 데이터에서)

PID  X Y  CLOSETG 
ABCEFO1 10.1 1.1 431 
XFEW134 30.3 -20.1 123 
+0

두 개의 조인을 사용하는 현재 쿼리가 실행되는 데 8 시간 이상이 걸리며 시간은 약 1 시간 또는 2 시간입니다. 나는 너를 시험해보고 그 결과를 알려 줄거야. – John

관련 문제