2012-02-08 6 views
4

위도와 경도의 두 열이있는 테이블이 있습니다. 모든 객체를 "직사각형"(위도/경도 좌표 메트릭의 사각형) 경계 상자 안에 넣고 싶습니다. 최소 최대 위도와 최소 최대 경도. 기본적으로 다음 pseudo-SQL을 사용합니다.공간 인덱스와 두 좌표 인덱스

SELECT * FROM MyTable WHERE lat < :maxlat AND lat > :minlat 
    AND lon < :maxlon AND lon > :minlon 

내 테이블을 인덱싱하는 가장 좋은 솔루션은 무엇입니까? 2 열 인덱스? 두 개의 열에 두 개의 인덱스가 있습니까? 공간 인덱스?

특수한 열과 특정 라이브러리가 필요하기 때문에이 경우 공간 인덱스가 실제로 필요한지 알고 싶습니다. 모든 것이 데이터베이스 이식성과 단순성을 희생시키면서 발생합니다.

참고 :이 질문은 데이터베이스에 무관심한 상태로 유지하고 싶지만, 완벽을 기하기 위해 PostGIS (PostgreSQL)를 사용하지 않고 PostGreSQL 8에서 작업한다는 사실을 언급합니다.

+1

이 유형의 공간 쿼리 만 수행한다는 것을 보장 할 수 있습니까? 두 점 사이의 실제 세계 (큰 원) 거리를 찾는 것과 같은 단순한 추가가 필요한 경우 모든 공간 라이브러리가 실제로 유용하게됩니다 ... 또한 경계 상자가 +/- 경도를 통과하면 어떻게 될지 고려하십시오. 170,0 -170,10 (이것은 태평양 지역에서 유효한 경계 상자입니다). http://gis.stackexchange.com – tomfumb

+0

예를 들어이 유형의 공간 쿼리 만 수행 할 것이라고 확신 할 수 있습니다. 그리고 이미 두 점 (Haversine 함수) 사이의 큰 원 거리를 계산하는 함수가 있습니다. 태평양을 건너는 것에 관해서는, 그것은 덮개가있는 지역에서 벗어났다. (그러나 minlon과 maxlon을 바꾸는 작은 시험으로 쉽게 다룰 수 있었다.) –

답변

1

PostgreSQL의 버전은 8.0, 8.1 등입니까? '상위 버전'인 경우 위도옥타브 열을 고유 한 열 유형으로 입력 해보세요. 이처럼 :

explain analyze 
select * 
from MyTable 
where lat < :maxlat and lat > :minlat 
and lon < :maxlon and lon > :minlon 

또는 :

explain analyze 
select * 
from MyTable 
where coor <@ box '((:minlat,:minlon),(:maxlat,:maxlon))' 

create index MyTable_lat on MyTable (lat); 
create index MyTable_lon on MyTable (lon); 
create index MyTable_coor on MyTable using gist (coor); 

지금 당신은 쿼리의 종류 빠른 테스트 할 수 있습니다

create table MyTable (
    ... 
    lat integer, 
    lon integer, 
    coor point, 
    ... 
); 

insert MyTable (..., lat, lon, coor, ...) values (..., lat1, lon1, '(lat1, lon1)', ...) 
... 

을 그리고 테스트에 필요한 인덱스를 생성

나는 PostgreSQL 9에 대한 테스트를했다. (2 0000 레코드) 두 번째 옵션이 더 빠릅니다.

+0

내 버전은 8.4.10입니다. 당신은 * 더 빨리 말하는거야, 얼마나? 나는 단순성과 이식성에 반하는 속도로 기꺼이 교환 할 생각이다. –

+1

안녕하세요 @ IOranger, 얼마나 친척입니다. 20000 레코드가있는 테이블에서 lat와 lon을 사용하여 465 레코드를 추출 할 때 : coor를 사용하여 (비용 = 22.59..190.13 행 = 266 너비 = 28) (실제 시간은 0.260..0406 행 = 465 루프 = 1) 비용 = 4.41..60.17 행 = 20 너비 = 28) (실제 시간 = 0.165..0.250 행 = 465 루프 = 1). 위도와 경도를 사용하여 8515 개의 레코드를 추출 할 때 (비용 = 0.00..545.00 행 = 8270 너비 = 28) (실제 시간 = 0.732..5.331 행 = 8515 루프 = 1). coord : (비용 = 4.41..60.17 행 = 20 너비 = 28) (실제 시간 = 1.699..2.684 행 = 8515 루프 = 1). – doctore

관련 문제