2013-01-19 3 views
0

나는 작동하는 쿼리가 있지만, 내가 사용할 수있는 더 둔한 덜 둔한 폼이 있는지 궁금합니다. 내 지오 메트릭 주위에 검색 범위를 좁히기위한 경계 상자를 이미 만들었지 만 ST_Transforms에 대한 여러 번 호출은 어색해 보입니다. BTW : 두 줄 (gg와 gm)은 동일한 점을 가지고 있습니다. 사전에POSTGIS SELECT optmization

감사합니다, 그것은 필터링하기 전에 형상의 모든을 버퍼링 할 필요가 있기 때문에, WHERE에서 ST_Buffer이 비싸다 사용
- 매트

CREATE TABLE lines 
(
    line_id bigserial NOT NULL, 
    line_gm_bbox geometry, 
    line_gm_line geometry, 
    line_gg_line geography(LineString,4326), 
) 
WITH (OIDS=FALSE); 

CREATE INDEX line_bbox_idx 
    ON lines 
    USING gist 
    (line_gm_bbox); 


SELECT l.* FROM lines AS l WHERE l.line_gm_bbox && ST_Transform(ST_Buffer(ST_Transform(ST_GeomFromText('POINT(-71.44513306666667 42.7368536)',4326),3395), 2000), 4326) 
          AND ST_DWithin(l.line_gg_line, ST_GeomFromText('POINT(-71.44513306666667 42.7368536)',4326), 200); 

답변

1

. 같은 효과로 ST_DWithin 만 사용하십시오.

또한 lines 테이블 스키마는 과도한입니다. 쿼리 메트릭 거리로 변환 할 필요가없는 하나의 지리적 열만 있으면됩니다. 테두리 상자는 기술적으로 요점 색인에 저장되어야하지만, 어떤 이유로 필요하면 box type으로 추출 할 수 있습니다. 요점 색인이있는 한 당신은 대부분 신경 쓸 필요가 없습니다.

간단한 스키마에 lines 테이블을 다시 정의 :

SELECT l.* 
FROM lines AS l 
WHERE ST_DWithin(l.geog, ST_MakePoint(-71.44513306666667, 42.7368536), 200); 
:

CREATE TABLE lines 
(
    gid bigserial primary key, 
    geog geography(LineString,4326) 
); 
CREATE INDEX ON lines USING gist (geog); 

당신이 시점의 관심 200m 내에서 모든 라인을 조회하려는 경우, 같이 쿼리를 단순화