Hiệu suất PostGIS ST_Union


8

Tôi đang cố gắng thực hiện thao tác 'hòa tan' trong PostGIS bằng lệnh ST_Union.

Lớp đầu vào được thừa nhận khá lớn và phức tạp. Theo 'lớn', ý tôi là 57.771 tính năng, với số lượng đỉnh dao động từ 4 đến 758.018 mỗi tính năng, trung bình khoảng 86 đỉnh cho mỗi tính năng. Chỉ có khoảng 10 trong số các tính năng có> 10.000 đỉnh. "Phức tạp", ý tôi là các đa giác có nhiều lỗ hổng, chồng chéo lộn xộn, đảo, v.v. và các đa giác lớn có xu hướng có một hộp giới hạn bao gồm nhiều đa giác nhỏ hơn, có lẽ các chỉ số rending ít hữu dụng hơn.

Vấn đề là truy vấn cực kỳ chậm đến mức không thể sử dụng được. Tôi đã đọc bài đăng năm 2009 của Paul ở đây khiến tôi tin rằng truy vấn của tôi vẫn còn khá nhanh. Tôi đang sử dụng lệnh sau; Tôi đang làm điều gì đó trắng trợn hoặc không hiệu quả?

SELECT  ST_Union(f.geom) as geom, column1,column2,column3
FROM "inputlayer" As f 
GROUP BY column1,column2,column3

Chỉnh sửa: Tôi đang sử dụng:

POSTGIS="2.1.4 r12966" GEOS="3.3.3-CAPI-1.7.4" PROJ="Rel. 4.7.1, 23 September 2009" GDAL="GDAL 2.0.0dev, released 2014/04/16" LIBXML="2.7.8" LIBJSON="UNKNOWN" TOPOLOGY RASTER PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit

Máy tôi đang chạy máy chủ db là một máy ảo không có nhiều năng lượng. Tôi sẽ thử ý tưởng SET work_mem = 50000 và xem mọi thứ diễn ra như thế nào!


Để rõ ràng, bạn muốn kết hợp các hình học cho mọi kết hợp của cột1, cột2 và cột3? Bạn có thể định nghĩa lớn, phức tạp và chậm và những gì được giải thích hiển thị?
John Powell

1
John; vâng, tôi muốn kết hợp cho mọi kết hợp của cột1,2 và 3. Tôi không chắc chắn làm thế nào để định lượng 'lớn' - nhưng đó là một số đa giác rất phức tạp (nhiều đỉnh) với sự chồng chéo và đảo lộn xộn, v.v. 'sẽ phải thực hiện một số nghiên cứu về' giải thích 'trước khi tôi có thể trả lời câu hỏi cuối cùng của bạn!
Darren đối đầu

Giải thích có thể không hữu ích trong trường hợp này, vì nó chủ yếu đo thời gian tìm đĩa để thực sự đọc các hàng, dựa trên thống kê bảng, chỉ mục, v.v. Nó không tính đến thời gian chạy của hàm như ST_Union, mà phụ thuộc vào độ phức tạp của đa giác, số lượng trùng lặp, v.v.
John Powell

1
Vui lòng chỉnh sửa câu hỏi để thêm chi tiết.
Vince

1
Cũng phụ thuộc vào phiên bản GEOS của bạn. Các thuật toán tổng hợp tốt hơn đã được giới thiệu tại phiên bản 3.1.0.
Scro

Câu trả lời:


3

Loại hoạt động này sử dụng rất nhiều bộ nhớ công việc như tôi nhớ, vì vậy bạn muốn chắc chắn rằng bạn không ở cài đặt mặc định cho việc này khá thấp;

Hãy thử một cái gì đó như

SET work_mem=50000;
Then run your query

Bạn có thể muốn chơi xung quanh với cài đặt workmem đó

Bạn cũng sẽ muốn đổ nó vào một bảng - không xuất ra màn hình. Tôi giả sử bạn biết điều đó rồi

Những thứ khác bạn muốn xác minh - mà tôi đưa vào nhận xét nhưng sẽ lặp lại ở đây:

Có hai điều giúp cải thiện tốc độ kết hợp - điều tầng bạn đã chỉ ra và đối với đa giác, số tích lũy mảng nhanh hơn (mà tôi nghĩ đã xuất hiện trong PostGIS 1.5 (có thể là 1,4 không thể nhớ lại), PostgreQuery 8.4 (di chuyển là 9.0 có thể 'nhớ lại)). Ngoài ra, ngay cả GEOS mới hơn cũng sẽ không hoạt động tốt nếu bạn đang chạy <PostGIS 1.4

Vì vậy, kiểm tra cả phiên bản postgis và phiên bản postgresql đều quan trọng

SELECT postgis_full_version() || ' ' || version();

Cũng có ST_MemUnion. Sử dụng ít bộ nhớ hơn, nhiều bộ xử lý hơn: postgis.net/docs/ST_MemUnion.html
Scro

3
Chức năng đó khá cũ. Tôi nghĩ rằng hàm giả ST_Union mới thực sự bảo tồn bộ nhớ tốt hơn chức năng đó.
LR1234567

2

Ngay cả trước khi bạn thực thi ST_Union

PHÂN TÍCH cơ sở dữ liệu của bạn để cập nhật số liệu thống kê truy vấn.

VACUUM cơ sở dữ liệu của bạn để thanh lọc nếu bạn chưa chạy Autovacuum. Kiểm tra cài đặt chính của bạn để đảm bảo rằng chúng được đặt thành giá trị hợp lý ..

shared_buffers should be 10% to 25% of available RAM
effective_cache_size should be 75% of available RAM 

Kiểm tra thay đổi work_mem : tăng nó lên 8MB, 32MB, 256MB, 1GB. Liệu nó có làm cho một sự khác biệt?

* 32 MB là mặc định

nguồn: https://wiki.postgresql.org/wiki/Tuning_Your_PostgreQuery_Server


Cảm ơn. Tôi vừa thử ANALYZE, VACUUM và tăng shared_buffers và hiệu quả_cache_size, và có cùng một vấn đề. Tôi sẽ tiếp tục điều chỉnh khi thời gian cho phép.
Darren đối thủ

@DarrenCope có tiến triển gì không? Tôi đang đối mặt với cùng một vấn đề.
Michal Zimmermann

@zimmi; tiếc là không :( Tôi vẫn ở nơi trước đây! Bạn có đang làm điều tương tự không? Có lẽ hãy chia sẻ một ví dụ và xem liệu có điểm tương đồng nào không
Darren

1
@DarrenCope ST_Buffer (St_Collect (wkb_geometry), 0) dường như nhanh hơn rất nhiều và nó phù hợp với nhu cầu của tôi. Nó có thể giúp bạn là tốt.
Michal Zimmermann
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.