Chỉ số không gian PostgreSQL / PostGIS - không tăng tốc


15

Tôi có một bảng không gian trong cơ sở dữ liệu PostgreSQL / PostGIS. Mỗi hàng trong đó đại diện cho một Đa giác. Nó có dạng sau:

+----+--------+
|gid |   way  |
+----+--------+
|241 | 01030..|

Cột hình học là "cách" chứa hình học cho đa giác. Trong WKT đó là: POLYGON (('....')). Tôi đang thực hiện rất nhiều truy vấn ST_Contains trên bảng này, để kiểm tra xem hai đa giác có được chứa trong nhau hay không, ví dụ:

Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16

Tôi đã tự hỏi làm thế nào để tăng tốc truy vấn này và thêm một chỉ mục không gian trên bảng:

CREATE INDEX table_way_gist ON table USING gist(way);

Nhưng thật ra tôi không thấy tăng tốc. Tôi tạo chỉ mục SAU Tôi điền vào bảng với tất cả các đa giác TRƯỚC KHI tôi thực hiện các truy vấn ST_Contains. Chỉ số nên được thêm vào trước khi điền vào một bảng? Có yêu cầu đặc biệt nào trên bàn để làm việc với chỉ số không? Hình chiếu (srid) của cách cột hình học được đặt thành 900913.

Tôi đang sử dụng: psql (PostgreSQL) 9.1.4 / POSTGIS = "1.5.3"

Câu trả lời:


16

Chỉ mục hiệu quả nhất cho truy vấn được thể hiện trong câu hỏi của bạn là chỉ số trên gid vì đây là cột duy nhất xuất hiện trong biểu thức where:

 CREATE INDEX table_gid ON table (gid);

Bạn có thể thả chỉ số ý chính một cách an toàn vì nó sẽ chỉ tiêu tốn dung lượng và chèn / cập nhật / xóa chậm.

Giải thích dài

Như tôi đã nói, chỉ số hiệu quả nhất trong trường hợp của bạn là chỉ số trên gid vì nó sẽ cho phép công cụ db truy xuất các hàng nhanh hơn (với việc truy xuất thường là phần chậm nhất của quy trình). Sau đó, nó có thể sẽ tính toán tốt hơn kết quả của

  ST_Contains(a.way, b.way)

espression mà không nhìn vào chỉ số. Lý do là các nhà quy hoạch truy vấn có thể sẽ ước tính rằng chi phí phụ thêm của nhìn lên những ý chính chỉ số trên cả hai cột so với nhìn lên các a.wayb.way giá trị trực tiếp không phải là giá trị nỗ lực là tổng số hàng để tìm kiếm có lẽ là rất nhỏ đặc biệt là nếu chỉ số là duy nhất.

Theo nguyên tắc, hãy nhớ rằng trình hoạch định có thể sẽ ưu tiên quét bảng hơn quét chỉ mục cho các bộ dữ liệu nhỏ (kích thước tập dữ liệu được ước tính bằng cách xem thống kê bảng).


Điều đó làm cho vấn đề rõ ràng hơn với tôi. Tôi sẽ thử nó. Vậy nếu tôi đặt truy vấn ST_Contains () vào mệnh đề WHERE, thì chỉ mục không gian có thực sự hữu ích? Tôi nghĩ rằng tôi phải sắp xếp lại tập lệnh của mình để gọi ST_Contains trong mệnh đề WHERE. Hiện tại tôi đang lặp qua tất cả các đa giác và luôn kiểm tra hai trong số chúng một cách riêng biệt.
MichiMichbeck

?? bạn đang cho rằng một chỉ số không gian làm chậm mọi thứ? Đó là một điều mới đối với tôi bởi vì nơi tôi làm việc, chúng tôi có các chỉ số không gian cho mỗi bảng và tôi tự hỏi liệu đó có phải là một thực tiễn tồi không
Luffydude

13

Như unicoletti đã nói, chỉ số chính trong cột hình học sẽ chỉ hoạt động nếu bạn sử dụng ST_Contains () trong biểu thức WHERE.

Ví dụ: nếu bạn muốn biết tất cả các đa giác có chứa nhau, bạn có thể sử dụng một cái gì đó như thế này:

SELECT a.gid, b.gid
FROM table AS a, table as b
WHERE a.gid != b.gid and ST_Contains(a.way, b.way)

Trong trường hợp này, tùy thuộc vào kích thước của bảng và độ phức tạp của hình học của bạn, chỉ số chính sẽ cung cấp tốc độ đáng kể, vì ST_Contains sẽ bắt đầu bằng cách lọc các đa giác bằng cách so sánh các hộp ranh giới của chúng trước khi thực sự kiểm tra hình dạng hoàn chỉnh của chúng. Bạn có thể thấy một lời giải thích nhỏ trong Hướng dẫn OpenGeo .


Có tôi thấy, tôi cần truy vấn này để liên quan đến kiểm tra ranh giới chỉ số. Thx Alexandre. (Tôi sẽ đánh dấu unicoletti là giải pháp, vì anh ấy đã nhanh chóng và giải quyết vấn đề cho tôi)
MichiMichbeck
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.