2016-07-14 18 views
2

테이블이 있습니다. 포인트 유형의 지리적 포인트가있는 포인트. 나는 가장 가까운 지점을 얻기 위해이 코드를 실행하고 있습니다 :가장 가까운 지점을 선택하십시오. SQL Server 공간

CREATE SPATIAL INDEX SpatialIndex ON Points (Point); 

불행하게도, 쿼리가 매우 느리다 :

DECLARE @Wgs84Longitude FLOAT; 
DECLARE @Wgs84Latitude FLOAT; 

DECLARE @Point GEOGRAPHY = Geography::STPointFromText(N'POINT(' 
              + CAST(@Wgs84Longitude AS NVARCHAR(MAX)) 
              + N' ' 
              + CAST(@Wgs84Latitude AS NVARCHAR(MAX)) 
              + N')', 4326); 

SELECT 
    TOP 1 
    * 
FROM Points 
ORDER BY @Point.STDistance(Point) ASC; 

포인트 테이블이 인덱스를 가지고있다. 더 빠르게 (색인 및/또는 쿼리를 현명하게) 개선 할 수있는 것이 있습니까?

추신 :

나는이 몇 가지 맛으로 연주 :

CREATE SPATIAL INDEX SpatialIndex ON [Core].[InternationalPostcodeList](Point) 
USING GEOGRAPHY_GRID 
WITH 
(
--BOUNDING_BOX =(-8.164229, 49.18581, 8.05384, 60.717093) 
     GRIDS=(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH) 
    , CELLS_PER_OBJECT = 64 
    , PAD_INDEX = OFF 
    , SORT_IN_TEMPDB = OFF 
    , DROP_EXISTING = OFF 
    , ALLOW_ROW_LOCKS = ON 
    , ALLOW_PAGE_LOCKS = ON 
) ON [PRIMARY]; 

성능은 여전히 ​​받아 들일 수있다.

답변

0

MSDN의 Microsoft 고유 기사에서는 "Nearest Neighbor"쿼리가 Spatial Index를 사용하도록 몇 가지 개선 사항을 제안합니다. 가장 중요한 점은 거리를 제한하기 위해 WHERE 절에서 STDistance를 사용하지 않는 것입니다 (어떤 방식 으로든 필터링 할 수없는 경우).

해당 내용을 적용하여 성능이 향상되는지 확인하십시오. 더 자세한 정보는 기사 자체를 참조하십시오. 다음과 같이 쿼리에 지점을 만드는 과정을 단순화 할 수 있습니다 첫째 EDIT

MSDN Nearest Neighbor

: 둘째

DECLARE @Point GEOGRAPHY = GEOGRAPHY::Point(@latitude, @longitude, @srid); 

, 아마 차이를 만들 않을거야 ,하지만 당신은 최대 16 셀을 가진 HHHH로 공간 인덱스를 선언 할 수 있습니다 (당신은 하나에 갈 수 있습니다). 하루가 끝나면 인덱스가 가장 낮은 레벨에있는 레코드는 단 하나뿐입니다. 그러나 열에 공간 데이터 형식을 혼합 할 것인지 여부에 따라 다릅니다.

세 번째로 몇 가지 테스트를 실행 했으므로 결과에 대해 1 초 미만으로 쉽게 벗어날 수 있어야합니다. 다음 쿼리를 사용했습니다 :

SELECT TOP 1 
* 
FROM 
Points P 
WHERE P.Point.STDistance(@Point) < (50 * 1609.344) -- 50 miles 
ORDER BY P.Point.STDistance(@Point) 

결과가 1 초보다 상당히 빠릅니다. WHERE 절을 생략하면 시간은 약 1500 % 느려졌습니다 (데이터 집합 크기에 따라 증가/감소합니다). 그러나 이것은 여전히 ​​10-12 초의 결과보다 훨씬 빠릅니다.

공간 인덱스가 작동하는지 확인할 수 있습니까? 그렇지 않으면 WITH (INDEX (SpatialIndex)) 힌트를 사용해보십시오. 그래도 문제가 해결되지 않으면 쿼리 실행 계획을 업로드 할 수 있습니까?

+0

감사합니다. 기사에서 제안 된대로 WHERE 절을 도입하면 공간 인덱스 사용을 명백히 강화하기 위해 쿼리가 더 느리게 실행됩니다. – cs0815

+0

@csetzkorn 테이블의 크기는 (행 단위로) 무엇이며 현재 귀하가 얻고있는 시간은 무엇입니까? –

+0

약 250 만 개의 행 ... – cs0815