짧은 답변 : 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를 비교하여이 쿼리가 느릴 것으로 예상합니다.