2010-03-22 2 views
2

나는 위도와 경도와 함께 딜러들로 가득 찬 테이블을 가지고 있습니다. 주어진 위도와 경도에 대해 가장 가까운 상위 n 딜러를 결정하려고합니다. 위치 간의 거리를 계산할 수있는 기능이 이미 있습니다.하지만 가능한 한 적은 계산 만 수행하고 싶습니다 (테이블에 수천 개의 항목이 포함될 수 있습니다). 현재 각 항목의 거리를 계산 한 다음 정렬해야합니다. 실적을 향상시키기 위해 계산을 수행하기 전에 정렬 할 수있는 방법이 있습니까?SQL 2003 거리 위도 경도

This 질문이 좋지만, 나는 항상 내 범위를 알 수 없습니다. 나는 단지 임의로 높은 범위를 고른 다음 결과를 수정해야합니까? 커뮤니티에서 제공 할 수있는 도움에 감사드립니다.

declare @Lat real 
declare @lon real 

Set @lat = 41.05 
Set @lon = -73.53 

SELECT top 10 
    MemberID, 
    Address1, 
    City, 
    State, 
    Zip, 
    Phone, 
    Lat, 
    Lon, 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance 
FROM 
    Dealers 
Order by 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) 

답변

1

대신 모든 레코드에 계산을 수행하는, 당신은 그럼 당신은 당신의 정확한 기능을 사용하여 실제 상위 10 개를 선택할 수 있습니다 귀하의 위도/경도 숫자에 대한 간단한 피타고라스 계산을 사용하고 상단 (20)를 선택할 수 있습니다. 이 작업은 처음부터 부정확하지만 데이터 집합을 줄이기에는 정확해야합니다.

편집 : 그러나이

declare @Lat real 
declare @lon real 

Set @lat = 41.05 
Set @lon = -73.53 

SELECT top 10 
    MemberID, 
    Address1, 
    City, 
    State, 
    Zip, 
    Phone, 
    Lat, 
    Lon, 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance 
FROM 
    Dealers 
WHERE 
    MemberId IN 
(
    SELECT TOP 20 
     MemberID 
    FROM 
     Dealers 
    ORDER BY 
     SQRT(SQUARE(@Lat - Lat) + SQUARE(@Lon - Lon)) 
) 
Order by 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) 

같은 뭔가, 나는 당신이 당신의 데이터 집합을 모두 시도하고 실제 성능 차이가있을 수 있습니다 무엇을보고 그것을 프로필을 제안한다.

+0

감사합니다. 이것은 성능을 향상시키는 것처럼 보입니다 (레코드 수가 증가함에 따라 성능이 향상됨). 실제 거리가 필요하지 않은 경우에는 내부 쿼리를 생략하고 SQRT (SQUARE (@Lat - Lat) + SQUARE (@Lon-Lon)) 명령을 사용하는 것이 잘못되었습니다. –

+1

아니요, 짧음 거리, 30 마일 이하로 피타고라스는 수백 피트에 이릅니다. 거리가 멀면 Haversine 함수를 사용하십시오. –

1

지형 공간 인덱스가 정말 좋겠다고 생각합니다. 그렇지 않으면 행 수가 매우 커질수록 피타고라스 계산을 수행 할 때마다 모든 행에 액세스해야합니다.

SQL Server는 공간 데이터 형식을 지원하며 SQL Server 2008은 "new spatial indexes for high performance queries"을 자랑합니다. SQL Server 공간 데이터 형식을 사용한 다음 공간 인덱스에 대해 근접 쿼리를 수행 할 수 있습니까?