공간 인덱스가있는 테이블에 지형 입력 열이 있습니다. 성능을 향상시키기 위해 색인을 사용하면서 제공된 위도/경도의 X 미터 내에있는 상위 N 개의 행을 선택하려면 어떻게해야합니까?지형 열에서 주변 지점 검색
3
A
답변
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입니다.
관련 문제
- 1. Google Maps 반경 주변 지점
- 2. Google지도 확대/축소 주변 지점 확대/축소 대신 중앙 지점
- 3. 지오 코드 - 주변 (주변/경도) 주변 경계 쿼리
- 4. sqlite의 열에서 행 검색
- 5. 모든 열에서 검색
- 6. 두 지리적 지점 사이에서 가장 높은 지형 고도 확보
- 7. Google지도 Autosuggest - 자동 지문 검색시 지형 검색
- 8. Eclipse에서 선택 지점 검색 GEF
- 9. Regex/Preg_replace, 검색 지점 변경
- 10. CellTable의 다른 열에서 셀 검색
- 11. 데이터베이스 열에서 모든 데이터 검색
- 12. Oracle의 열에서 특정 값 검색
- 13. nhibernate의 사용자 유형 열에서 검색
- 14. SQLite fts3 : 열에서 문자열 검색
- 15. 마스크를 사용하여 지형 잡음 생성?
- 16. 동적 열에서 LINQ-to-SQL 검색?
- 17. SQL : 최소 횟수로 발생한 열에서 값 검색
- 18. rails searchlogic 여러 열에서 플러그인 검색
- 19. varchar 열에서 일치하는 MySQL 빠른 검색
- 20. MySQL에서 테이블의 여러 열에서 concatanated 문자열을 검색
- 21. Linux 스크립팅 : 특정 열에서 키워드 검색
- 22. 테이블의 세 번째 열에서 행 값 검색
- 23. ASP.NET에서 DataGrid의 열에서 행 데이터 검색
- 24. PHP에서 데이터베이스 검색 단일 열에서 모두
- 25. 수없는 주변
- 26. (적어도 주변)
- 27. Rails 3.x에서 Solr (websolr)을 사용한 지형 공간 검색
- 28. Solr을 사용하여 경계 상자 내 지형 공간 검색
- 29. WF 지속성 지점 트랜잭션 제어
- 30. 시작 지점 및 끝 지점 (!)
이 필요한 것 같습니다. 내가 추가 한 공간 인덱스를 사용하는지 확인해 보겠습니다. – Bahamut
실행 계획에서 공간 인덱스를 사용하고 있지 않음을 나타냅니다. – Bahamut
@Bahamut (http://blogs.msdn.com/b/isaac/archive/2008/08/29/is-my-spatial-index- being-used.aspx) 색인 힌트를 추가했습니다. – Paddy