내 데이터베이스에는 zipcode 정보 (필자는 lon/lat 좌표로 묶여 있음)가있는 미국 전역에 약 2,000 개의 위치가 흩어져있는 디렉터리가 있습니다.SQL 교차 적용 성능 문제
나는 또한 내가 이웃 위치를 얻기 위해 노력하고 각각의 위치는 (검색 같은 우편 번호 제외)
를 우편 번호 이웃의 목록을 반환하는 두 개의 매개 변수 (우편 번호 & 마일) 소요 테이블 기능이 ids. 위치 # 4 세 근처 위치를 갖는다면, 출력 보일 것 같은
- 4 5
- 4 24
- 4 (137) 인
, 위치 5, 24, 137 다음과 같이 내가 원래 크로스 내 기능을 적용 사용하려 4.
위치의 X 마일 이내 :
SELECT A.SL_STORENUM,A.Sl_Zip,Q.SL_STORENUM FROM tbl_store_locations AS A
CROSS APPLY (SELECT SL_StoreNum FROM tbl_store_locations WHERE SL_Zip in (select zipnum from udf_GetLongLatDist(A.Sl_Zip,7))) AS Q
WHERE A.SL_StoreNum='04'
그러나 결과는 20 분 넘게 실행되어 취소되었습니다. 나는 우편 번호에 하드 코딩 시도했고, 즉시 목록
SELECT A.SL_STORENUM,A.Sl_Zip,Q.SL_STORENUM FROM tbl_store_locations AS A
CROSS APPLY (SELECT SL_StoreNum FROM tbl_store_locations WHERE SL_Zip in (select zipnum from udf_GetLongLatDist('12345',7))) AS Q
WHERE A.SL_StoreNum='04'
인근 지역의 목록을 달성하는 가장 효율적인 방법은 무엇입니까 반환? 여기서 "04"를 예로 들었을 때 2,000 개 지점에 대한 분석을 실행하고 싶습니다.
"udf_GetLongLatDist"는 몇 가지 수학을 사용하여 두 지리 좌표 간의 거리를 계산하고 거리가 0보다 큰 우편 코드 목록을 반환하는 함수입니다.
귀하의 질문과 직접적인 관련이없는 쪽 댓글이지만, 우편 번호에 대한 무게 중심 위도/경도 위치는 종종 시골 우편 번호 일 때 대부분의 사람들이 거주하는 우편 번호 내의 위치와 상당히 멀리 떨어져있었습니다. 그래서 우리는 zipcode와 관련된 주요 도시/도시의 위도/경도와 위도/경도의 두 위치를 사용했습니다. 이 두 위치 중 하나가 대상 위치의 x 마일 내에있는 경우 우편 번호가 가까이있는 것으로 간주되었습니다. – hatchet