Trả lời ngắn gọn: số Với loại truy vấn UPDATE, chúng tôi được cập nhật mỗi hàng trong locations
( "Seq Scan"), và chỉ số GIST vào the_geom
trong regions
là đủ trong việc giúp đỡ hàng hạn các ST_Within
điều kiện để cặp lên hàng ngay từ regions
.
Câu trả lời dài hơn: Điều kỳ diệu để tìm ra điều này là so sánh những gì bạn nhận được từ giải thích truy vấn . Từ pgAdmin III, có một nút "Giải thích truy vấn" ở đầu trình soạn thảo truy vấn hoặc từ pssql, chỉ cần đặt tiền tố truy vấn của bạn bằng "giải thích":
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)
Bạn không cần phải hiểu mọi thứ bị ho ở đây. Điều quan trọng cần thấy ở đây là ở phần bên trong (SubPlan 1), nó chỉ ra "Index" (= sử dụng một chỉ mục, có thể tăng tốc độ đáng kể) và không phải là "Seq Scan" (= quét chuỗi, tức là kiểm tra từng hàng để xem nếu nó ở trong, có thể chậm hơn). Nếu bạn thêm / xóa chỉ mục GiST trên locations
, đầu ra của truy vấn giải thích này hoàn toàn giống nhau, do đó hiệu suất truy vấn phải giống nhau.
Tuy nhiên, nếu bạn làm điều gì đó ngớ ngẩn và xóa chỉ mục GiST của bạn khỏi regions
, bạn sẽ thấy một kế hoạch truy vấn khác từ cùng một truy vấn như trên:
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)
Điều quan trọng cần thấy giữa hai truy vấn giải thích là ước tính chi phí tối đa .. tương phản 74,05 ở đây với 8,52 trước đây, vì vậy bạn mong muốn truy vấn này chậm hơn.