다각형 쿼리의 포인트에 대한 GIST 인덱스를 통한 성능 향상


10

두 개의 테이블이 있습니다 : 위치 (id, region_id, the_geom) 및 region (id, the_geom). 각 위치 지점마다 해당 지역이있는 지역을 결정하고 싶습니다.

UPDATE locations SET region_id = 
 (SELECT id FROM regions 
  WHERE ST_Within(locations.the_geom,regions.the_geom)
 );

위치 지점에 GIST 색인을 작성하는 것이 이치에 맞습니까? 지역 다각형에 대한 색인을 작성하지만 포인트는 확실하지 않습니다. 쿼리 속도가 빨라 집니까?

답변:


14

짧은 답변 : UPDATE 쿼리 이러한 유형의 번호, 우리는 각 행을 업데이트하는 locations( "서열 스캔")과의 GIST 지수 the_geom에는 regions에 대한 제한 행을 돕는 충분한 ST_Within에서 쌍 업 오른쪽 행에 조건 regions.


더 긴 대답 : 이것을 알아내는 마술은 Explain query 에서 얻은 것을 비교하는 것 입니다. pgAdmin III에는 쿼리 편집기 상단에 "쿼리 설명"버튼이 있거나 pgsql에는 "explain"이라는 접두사를 붙입니다.

postgis=# explain UPDATE locations SET region_id =
postgis-#  (SELECT id FROM regions
postgis(#   WHERE ST_Within(locations.the_geom, regions.the_geom)
postgis(#  );
                                         QUERY PLAN
--------------------------------------------------------------------------------------------
 Seq Scan on locations  (cost=0.00..8755.54 rows=1000 width=110)
   SubPlan 1
     ->  Index Scan using regions_gist_the_geom on regions  (cost=0.00..8.52 rows=1 width=4)
           Index Cond: ($0 && the_geom)
           Filter: _st_within($0, the_geom)
(5 rows)

기침 된 모든 것을 이해할 필요는 없습니다. 여기서 가장 중요한 것은 가장 안쪽 부분 (SubPlan 1)에 있으며 "Seq Scan"(= 시퀀스 스캔, 즉 각각을 검사하는 것)이 아니라 "Index"(= 인덱스를 사용하여 속도를 상당히 높일 수 있음)를 나타냅니다. 안에 있는지 확인하려면 속도가 느려질 수 있습니다). 에 GiST 색인을 추가 / 삭제하면 locations이 Explain 쿼리의 출력이 정확히 동일하므로 쿼리 성능이 동일해야합니다.

그러나 어리석은 일을하고에서 GiST 색인을 제거 regions하면 위와 동일한 쿼리에서 다른 쿼리 계획이 표시됩니다.

                             QUERY PLAN
---------------------------------------------------------------------
 Seq Scan on locations  (cost=0.00..74288.00 rows=1000 width=110)
   SubPlan 1
     ->  Seq Scan on regions  (cost=0.00..74.05 rows=1 width=4)
           Filter: (($0 && the_geom) AND _st_within($0, the_geom))
(4 rows)

두 개의 Explain 쿼리 사이에서 볼 수있는 중요한 점은 최대 비용 추정치입니다. 여기에서 이전에 74.05와 8.52를 비교하여이 쿼리가 느릴 것으로 예상합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.