2012-04-17 10 views
3

공간 인덱스가있는 테이블에 지형 입력 열이 있습니다. 성능을 향상시키기 위해 색인을 사용하면서 제공된 위도/경도의 X 미터 내에있는 상위 N 개의 행을 선택하려면 어떻게해야합니까?지형 열에서 주변 지점 검색

답변

7

'색인을 사용하면서'이라고 말하면 어떻게됩니까?

나는 단지 (오늘) SQL 2012의 Geography 데이터 형식 실험,하지만 어쩌면 다음에 유용 시작했습니다 - 당신이 2008-R2

일부 데이터 생성 사용하고 깨닫는다 :

CREATE TABLE SpatialTable 
    (id int IDENTITY (1,1) PRIMARY KEY, 
    GeogCol1 geography, 
    GeogCol2 AS GeogCol1.STAsText()); 
GO 

INSERT INTO SpatialTable (GeogCol1) 
VALUES 
(geography::STGeomFromText('POINT(-122.360 47.656)',4326)), 
(geography::STGeomFromText('POINT(-122.343 47.656)',4326)), 
(geography::STGeomFromText('POINT(-122.358 47.660)',4326)), 
(geography::STGeomFromText('POINT(-122.348 47.649)',4326)), 
(geography::STGeomFromText('POINT(-122.348 47.658)',4326)), 
(geography::STGeomFromText('POINT(-122.358 47.653)',4326)) 

CREATE SPATIAL INDEX Spatialindex ON SpatialTable (GeogCol1) USING GEOGRAPHY_GRID 
WITH (
    GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
    CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, 
    DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON 
) 

관심 지점을 정의 :

인덱스를 생성

DECLARE @g geography; 
SET @g = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326); 

하는 점

SELECT TOP 2 
     @g.STDistance(st.GeogCol1) AS [DistanceFromPoint (in meters)] 
    , st.GeogCol2 
    , st.id 
FROM SpatialTable st WITH(INDEX(SpatialIndex)) 
WHERE @g.STDistance(st.GeogCol1) <= 750 
ORDER BY @g.STDistance(st.GeogCol1) ASC 

의 750m 이내, 2 가까운 찾기 제공합니다 :

DistanceFromPoint (in meters) GeogCol2     id 
----------------------------- ------------------------ ----------- 
234.715604015178    POINT (-122.348 47.649) 4 
711.760044795868    POINT (-122.358 47.653) 6 

SQL Execution Plan 인덱스가 사용되는 제안하고, this website 반환 된 거리가 올바른지 제안

이것이 당신이 필요로하는 것이 아닌지 알려주십시오. 나는이 책을 스스로 배우려고 노력하고 있습니다. 그래서 어떤 개정도 좋습니다!

*** 편집 **** 색인을 사용하도록 쿼리 테이블을 힌트로 추가했습니다 (이 MSDN post). 이 링크는 처음에는 SQL이 인덱스를 사용하지 않는 것이 더 빠를 것이라고 판단하면서 인덱스가 처음에는 사용되지 않았다고 설명합니다. 위 예제의 실행 계획은 인덱스를 사용하거나 사용하지 않는 97 %/3 %의 분리를 보여 주므로이 경우 SQL 최적화 프로그램이 올바른 생각을 가졌습니다.

색인을 사용하면 색인이 더 느려지는 이유는 수많은 블로그 게시물 및 여기에있는 질문의 제목 인 것 같습니다. 여기서는 SO입니다.

+0

이 필요한 것 같습니다. 내가 추가 한 공간 인덱스를 사용하는지 확인해 보겠습니다. – Bahamut

+0

실행 계획에서 공간 인덱스를 사용하고 있지 않음을 나타냅니다. – Bahamut

+0

@Bahamut (http://blogs.msdn.com/b/isaac/archive/2008/08/29/is-my-spatial-index- being-used.aspx) 색인 힌트를 추가했습니다. – Paddy

관련 문제