2014-09-08 3 views
5

SQL Server 지리 데이터 형식을 사용하여 데이터베이스에 레코드 위치를 저장하고 있습니다. 이 꽤 빨리 실행 내 테스트 데이터베이스에서 다스 기록의 부부와 함께지리와 거리를 사용하여 SQL Server 데이터베이스에서 레코드 선택

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326) 
DECLARE @distance AS INT = 10000 

SELECT * 
FROM records 
WHERE records.location.STDistance(@location) <= @distance 

나는 문제 없어,하지만 난 알고 나는 주어진 위치의 일정 거리 내의 모든 레코드를 선택하고 싶습니다 그 WHERE 절은 내 데이터베이스의 모든 레코드에 대해 STDistance를 실행하고 있으며 수천 개의 레코드가 있으면 크롤링 속도가 느려집니다.

더 좋은 방법이 있나요? 어쩌면 이웃 지역에서 일종의 지역 및 우선 데이터를 만들 수 있습니까?

+3

당신은하지만 ...이 ST_Distance 기능에 체크 위도/long 치의 범위를 좁힐 경계 상자의 일련의 작업을 수행 할 수 있습니다, 나는 마이크로 소프트가 그것을시키는 권하고 싶습니다. MSSQL 공간 인덱싱을위한 google을 수행하십시오 – Twelfth

+2

[공간 인덱스 개요] (http://msdn.microsoft.com/en-us/library/bb895265.aspx) – wdosanjos

답변

1

@Twelfth 권장대로 공간 인덱스를 설정하고 싶습니다. 또한 공간 인덱스를보다 효과적으로 활용하려면 거리가 아닌 범위에서 검색해야합니다.

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326) 
DECLARE @distance AS INT = 10000 
DECLARE @range AS geography = @location.STBuffer(@distance) 

SELECT * 
FROM records 
WHERE records.location.STIntersects(@Range) = 1