2014-06-13 2 views
1

문제는 간단합니다.오라클 공간 데이터베이스에서 많은 수의 점에 가장 가까운 라인 찾기

데이터 세트가 있습니다. 각 데이터 세트에는 포인트 세트가 있습니다. 각 점들의 집합은 6km 간격의 동일한 그리드입니다 (이 그리드는 결코 바뀌지 않습니다). 각 점에는 연관된 값이 있습니다. 각 데이터 집합과 관련이 없으므로 문제는 단지 하나의 점 집합으로 볼 수 있습니다.

포인트의 값이 사전 정의 된 임계 값을 초과하는 경우 해당 포인트의 특정 거리 내의 모든 라인 세그먼트를 찾기 위해 포인트를 Oracle 공간 데이터베이스에 대해 쿼리해야합니다.

해결할 수있는 간단한 문제입니다.

선 세그먼트에는 고유하지 않은 ID가있어 1 ~ 700 세그먼트의 크기로 그룹화 할 수 있습니다 (모두 미리 정의 된 토폴로지입니다).

궁극적으로 필자는 어느 지점과 일치하는 피쳐 ID와 각 지점에 대한 각 피쳐 일치의 선분 수를 알아야합니다. 데이터 세트 크기의 측면에서

:

  • 는 약 200 데이터 세트가 있습니다.
  • 데이터 세트 당 56,000 포인트가 있습니다.
  • 공간 인덱싱 된 데이터베이스에는 18 만 개가 넘는 선 세그먼트가 있습니다.
  • 선분을 총 1900 개의 피쳐로 그룹화 할 수 있습니다.
  • 일반적으로 데이터 세트 당 임계 값을 초과하는 10^3 점 이상의 순서는 많지 않습니다.

나는 해결책을 만들었으며 그것은 그러나 나는 전체 실행 시간에 만족 해요, 적절하게 작동합니다 - 그것은 세트 당 3 분 주위에 걸립니다.

일반적으로 사전 계산 작업이 오래 걸릴지는 모르겠지만 제약 조건 때문에이 작업을 실행하는 데 1 시간 이상 걸릴 수는 없으며 이상적으로는 1 시간 반 만 걸리는 것이 이상적입니다.

은 현재 내가 쿼리를 수행 할 SDO_WITHIN_DISTANCE를 사용하고, 나는 임계 값을 초과 각각의 모든 지점에 대해이 쿼리를 실행

SELECT id, count(shape) AS segments, sum(length) AS length 
FROM (
     SELECT shape, id, length 
     FROM lines_1 
    UNION ALL 
     SELECT shape, id, length 
     FROM lines_2 
) 
WHERE SDO_WITHIN_DISTANCE(
    shape, 
    sdo_geometry(
     3001, 
     8307, 
     SDO_POINT_TYPE(:lng,:lat, 0), 
     null, 
     null 
    ), 
    'distance=4 unit=km' 
) = 'TRUE' 
GROUP BY id 

이 쿼리를 실행하기 위해 약 0.4s 소요, 모든 아니라고 불량하지만 단일 데이터 세트에 합산되며 모든 데이터 세트에 합성됩니다.

Oracle 공간 데이터베이스에 익숙하지 않으므로 속도를 향상시키는 방법을 잘 모르겠습니다.

들어오는 점 집합의 형식을 변경할 수 없으며 데이터베이스 형식을 변경할 수도 없습니다.

내가 생각할 수있는 속도를 높이는 유일한 방법은 각 포인트에 대한 쿼리를 계산하고이를 별도의 테이블에 저장하는 것입니다.하지만 그다지 많지는 않지만 다른 복사본을 만듭니다. 자료.

그래서 질문은 - 더 나은 방법으로 쿼리를 수행 할 수 있습니까?

답변

0

다음 표에는 내 쿼리가 사전 계산되어 있습니다.

+---------+---------+ 
| LINE_ID | VARCHAR | 
| LAT  | FLOAT | 
| LNG  | FLOAT | 
+---------+---------+ 

효율적인 다중 행 세그먼트가 너무 많습니다.

사전 계산을 통해 테이블에서 관련 ID (궁극적으로 내가 신경 쓰는 부분)를 조회 할 수 있습니다.

쿼리 시간이 1/10 이하로 소요되므로 작업 속도가 훨씬 빠릅니다.

궁극적으로 매주 (약 2 시간 소요) 지점 간 ID 매핑을 재 계산해야한다는 번거 로움이 그만한 가치가있었습니다.

관련 문제