Hiệu suất đạt được thông qua chỉ số GIST cho điểm trong truy vấn đa giác


10

Tôi có hai bảng: vị trí (id, area_id, the_geom) và vùng (id, the_geom). Đối với mỗi điểm vị trí tôi muốn xác định vùng nằm ở:

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

Liệu nó có ý nghĩa để xây dựng một chỉ số GIST trên các điểm vị trí? Tôi sẽ xây dựng một chỉ mục trên đa giác khu vực nhưng tôi không chắc về các điểm. Nó sẽ tăng tốc truy vấn?

Câu trả lời:


14

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_geomtrong regionslà đủ 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.