2012-01-27 2 views
2

현재 위치와 특정 반경 내에서 주소 목록을 가져와야합니다. 우리의 기본 검색은 반경 25 마일을 허용하고 다른 옵션을 사용하면 약 5400 개의 결과를 반환합니다. Google은 주소를 지리 정보로 저장하고 꽤 괜찮은 검색을 만들었지 만 쿼리 실행에는 약 3 초가 소요됩니다. 실행 계획을 살펴보면 정렬에 가장 많은 시간이 걸리는 것을 알 수 있습니다. 이 속도를 높이려면 어떻게해야합니까? 우리는 그것이 매우 정확하고, 충분히 가깝고 견적이 좋다는 것을 상관하지 않습니다. 우리가 사용하는 쿼리는 다른 필터링 및 페이징 논리의 대부분을 뺀 것입니다.SQL Geography Fast 거리가 인접한 가장 가까운 이웃

declare @currentLatitude float, @CurrentLongitude float 
declare @currentPosition geography 
declare @radiusBuffer geography 
Set @radiusBuffer = @currentPosition.BufferWithTolerance(10 * 1609.344,.9,1); 
set @CurrentLatitude = 39.340579 
set @CurrentLongitude = -86.697479 
SET @currentPosition = geography::Point(@CurrentLatitude, @CurrentLongitude, 4326); 

SELECT a.*, 
ROW_NUMBER() OVER (ORDER BY rt.Position.STDistance(@currentPosition) ASC) AS RowNum 
from [Address] a 
    where a.Position.Filter(@radiusBuffer) = 1 

답변

1

봅니다 "WHERE a.Position.STDistance (@currentPosition) < 16093.44"대신 ROW_NUMBER ("a.Position.STDistance (@currentPosition)에 의해 ORDER를"쿼리 힌트와 공간 인덱스를 강제로 사용 사용).

+0

하지만 row_number를 사용하여 페이징을하지 않고도 저장 프로 시저의 목적을 무력화 할 수 있습니다 (예를 들어 임시 테이블을 사용하여 가짜로 만들 수 있음). – Josh

+0

해당 쿼리에 주문 기준을 사용해야합니다. 다음을보십시오. http://msdn.microsoft.com/en-us/library/ff929109.aspx – Kelqualyn

+0

당신은 SQL 2012에만 관련된 기사에 링크를했는데, 나는 2008 년을 사용하고 있습니다. – Josh

관련 문제