2014-02-07 2 views
1

나는 느린 실행중인 SQL 쿼리를 가지고 있으며 거리 계산과 관련이 있다고 판단했습니다. 이 계산을 사용하여 항목을 찾는 사용자가 지리적으로 가장 가까운 결과를 제공 할 수 있도록 정렬합니다.거리 계산의 효율성 MSSQL Geography

나는 지리적 함수 STDistance를 사용하여 사전 계산 된 SQL 지리 데이터 유형 위치로부터의 거리를 계산합니다.

있는 Location1은 사용자의 위치에 기초

Location1.STDistance (Location2를는) LOCATION2는 항목의 위치이다.

일단 수천 개의 행이 생성되면 성능이 좋지 않지만이를 수행하는 영리한 방법을 모르겠습니다. 쿼리 시간에 조회 대 계산을위한 가능한 모든 거리 계산을 저장하는 것이 가능할 것이라고 나는 생각하지 않습니다. (고유 한 사용자 위치 수 X 개의 고유 항목 위치 수 저장)

위치는 우편 번호로 결정됩니다. 지리적으로 범위는 미국으로 제한됩니다.

다른 의견은 있습니까?

답변

2

사람들이 일반적으로 느린 지리적 쿼리를 처리하는 방법은 합리적인 시간 내에 수행 할 수있을만큼 충분히 작은 것으로 설정을 줄이는 것입니다. 귀하의 경우, 사람들은 보통 "지리적 권투"로 알려진 기술을 사용합니다.

개념은 특정 위도/경도 경계에 속하는 인근 지점을 찾는 것입니다. 예를 들어. 42.45678, -22.6543 근처에있는 모든 사람들을 찾고자한다면, 나는 전형적인 최소 거리가 무엇인지 결정할 것입니다. 그것이 25 마일 또는 ± 0.15 도의 위도와 경도라고 가정합니다. 나는 그것들 모두를 질의 할 것이다. (41.95 ~ 42.95 사이의 경도, -22.15 ~ -23.15 사이의 경도). 그런 다음 거리 함수를 적용하여 축소 된 집합 내의 가장 가까운 사람을 찾습니다. 거리 계산은 분명히 아주 가깝지 않은 점수를 제거한 후에 훨씬 빠릅니다.

내 축소 세트가 너무 큰 것 같으면 작은 상자를 사용할 수 있습니다. 결과 집합에 행이 없거나 행 수가 너무 적 으면 커다란 결과 집합을 찾을 때까지 점차 커지는 상자를 선택하는 재귀 적 위조를 사용할 수 있습니다.

이 방법의 유일한 단점은 가장 가까운 점을 생략 할 가능성이 있다는 것입니다. 상자 가장자리와 접촉하는 원과 원 안에있는 상자를 생각해보십시오. 상자 구석에있는 점이 포함될 수 있지만 상자 외부의 점 (x 축 또는 y 축)이 제외 될 수 있습니다. 또한 위도/경도 상자는 실제로 적도에서 더 멀어 질수록 사각형보다 사다리꼴과 같습니다.

어쨌든, 속도가 완벽한 정확도보다 중요하다면. 지오 - 권투는 한 가지 접근 방법입니다.

+0

글쎄, 나는 위도와 모든 우편 번호를 가지고 있기 때문에 이미 상자를 가지고있다. 심지어 이것은 매우 정확하지도 않다고 생각했기 때문에, 이미 계산을 축소했다. – Nate