Dường như không có một phương pháp chung, được hỗ trợ, nhưng có một số thủ thuật có thể được sử dụng trong bối cảnh giới hạn để đánh giá tiến trình của một truy vấn riêng lẻ. Dưới đây là một số trong số họ.
Trình tự
Khi truy vấn CHỌN hoặc CẬP NHẬT bao gồm bất kỳ nextval(sequence_name)
hoặc INSERT có cột đích với nextval
mặc định, giá trị chuỗi hiện tại có thể được truy vấn nhiều lần trong một phiên khác với SELECT sequence_name.last_value
. Nó hoạt động vì các chuỗi không bị ràng buộc bởi các giao dịch. Khi kế hoạch thực hiện sao cho chuỗi được tăng tuyến tính trong suốt truy vấn, nó có thể được sử dụng như một chỉ báo tiến trình.
pgstattuple
Các pgstattuple mô-đun contrib cung cấp chức năng mà có thể peek trực tiếp tại các trang dữ liệu. Có vẻ như khi các bộ dữ liệu được chèn vào một bảng trống và chưa được cam kết, chúng được tính trong dead_tuple_count
trường từ pgstattuple
hàm.
Bản demo với 9.1: tạo một bảng trống
CREATE TABLE tt AS (n numeric);
Hãy chèn 10 triệu hàng vào đó:
INSERT INTO tt SELECT * FROM random() from generate_series(1,10000000);
Trong một phiên khác, hãy kiểm tra pgstattuple mỗi giây trong khi chèn:
$ while true;
do psql -Atc "select dead_tuple_count from pgstattuple('tt')";
sleep 1;
done
Các kết quả:
0
69005
520035
1013430
1492210
1990415
2224625
2772040
3314460
3928660
4317345
4743770
5379430
6080950
6522915
7190395
7953705
8747725
9242045
0
Nó rơi trở về 0 khi chèn xong (tất cả các bộ dữ liệu trở nên hiển thị và sống).
Thủ thuật này cũng có thể được sử dụng khi bảng không được tạo mới, nhưng ban đầu dead_tuple_count
có thể có giá trị khác không và nó cũng có thể thay đổi đồng thời nếu hoạt động ghi khác như autovacuum đang diễn ra (có lẽ là không? đồng thời để mong đợi với autovacuum).
Tuy nhiên, nó không thể được sử dụng nếu bảng được tạo bởi chính câu lệnh ( CREATE TABLE ... AS SELECT
hoặc SELECT * INTO newtable
), do việc tạo được giao dịch. Cách giải quyết sẽ là tạo bảng không có hàng (thêm LIMIT 0
) và điền vào bảng trong giao dịch tiếp theo.
Lưu ý rằng pgstattuple
không miễn phí: nó quét toàn bộ bảng trong mỗi cuộc gọi. Ngoài ra, nó giới hạn cho siêu nhân.
Bộ đếm tùy chỉnh
Trong blog của Pavel Stehule, anh ta cung cấp một hàm truy cập được triển khai trong C làm tăng các thông báo với số lần thực hiện được chỉ định. Bạn phải kết hợp chức năng với truy vấn bằng cách nào đó để cho người thi hành gọi nó. Các thông báo được gửi trong quá trình truy vấn và chúng không cần một phiên riêng biệt, chỉ có một máy khách SQL hiển thị chúng ( psql
là ứng cử viên rõ ràng).
Ví dụ về INSERT INTO được làm lại để đưa ra các thông báo:
/* transformation */
INSERT INTO destination_table
SELECT (r).*
FROM (SELECT counter(to_destination_table(_source), 1000, true) r
FROM source _source) x
Câu hỏi liên quan về stackoverflow, cho các chức năng:
Cách báo cáo tiến trình từ chức năng PostgreQuery chạy dài đến máy khách
Lựa chọn tương lai?
Kể từ tháng 5 năm 2017, có một bản vá đầy hứa hẹn được gửi tới cộng đồng nhà phát triển:
[PATCH v2] Lệnh tiến trình để theo dõi tiến trình của các truy vấn SQL chạy dài
mà có thể kết thúc như một giải pháp chung trong PostgreSQL 11 trở lên. Người dùng cảm thấy muốn tham gia vào các tính năng đang thực hiện có thể áp dụng phiên bản mới nhất của bản vá và thử PROGRESS
lệnh được đề xuất .
pv
lệnh này và nó không được cài đặt trên máy chủ Debian của tôi, nhưng nó nằm trong repo. Mô tả cho biết "pv (Trình xem ống) có thể được chèn vào bất kỳ đường ống thông thường nào giữa hai quy trình để đưa ra một dấu hiệu trực quan về tốc độ truyền dữ liệu". Một lệnh rất hữu ích!