Trong PostgreSQL, nhiều lệnh DDL có thể mất rất nhiều thời gian để thực thi. PostgreSQL có khả năng báo cáo tiến trình của các lệnh DDL trong quá trình thực thi lệnh. Kể từ PostgreSQL 9.6, có thể theo dõi tiến trình chạy VACUUM thủ công và autovacuum bằng cách sử dụng danh mục hệ thống chuyên dụng (được gọi là pg_stat_progress_vacuum).
PostgreSQL 12 đã thêm hỗ trợ theo dõi tiến trình của một số lệnh khác như CLUSTER, VACUUM FULL, CREATE INDEX và REINDEX.
Hiện tại, phương tiện báo cáo tiến độ chỉ có sẵn cho lệnh như bên dưới.
- Lệnh VACUUM
- Lệnh CLUSTER
- Lệnh VACUUM FULL
- Lệnh CREATE INDEX
- Lệnh REINDEX
Tại sao Tính năng Báo cáo Tiến độ trong PostgreSQL lại quan trọng?
Tính năng này rất quan trọng đối với người vận hành khi thực hiện một số thao tác chạy dài, vì có thể không chờ đợi một thao tác kết thúc một cách mù quáng.
Đây là một tính năng rất hữu ích để có được một số thông tin chi tiết như:
- Tổng công việc có bao nhiêu
- Khối lượng công việc đã hoàn thành
Tính năng báo cáo tiến độ cũng hữu ích khi thực hiện phân tích khối lượng công việc hiệu suất, điều này cũng tỏ ra hữu ích trong việc đánh giá xử lý công việc VACUUM để điều chỉnh các tham số cấp hệ thống hoặc cấp quan hệ một lần tùy thuộc vào mẫu tải.
Các lệnh được hỗ trợ và danh mục hệ thống
Lệnh DDL | Danh mục Hệ thống | Phiên bản PostgreSQL được hỗ trợ |
VACUUM | pg_stat_progress_vacuum | 9,6 |
CHÂN KHÔNG ĐẦY ĐỦ | pg_stat_progress_cluster | 12 |
CỤM | pg_stat_progress_cluster | 12 |
TẠO CHỈ SỐ | pg_stat_progress_create_index | 12 |
REINDEX | pg_stat_progress_create_index | 12 |
Cách theo dõi tiến trình của lệnh VACUUM
Bất cứ khi nào lệnh VACUUM đang chạy, chế độ xem pg_stat_progress_vacuum sẽ chứa một hàng cho mỗi chương trình phụ trợ (bao gồm các quy trình autovacuum worker) hiện đang hút bụi. Chế độ xem để kiểm tra tiến trình chạy lệnh VACUUM và VACCUM FULL là khác nhau vì giai đoạn hoạt động của cả hai lệnh là khác nhau.
Các giai đoạn hoạt động của Lệnh VACUUM
- Đang khởi chạy
- Đang quét đống
- Chỉ mục hút bụi
- Đang hút bụi
- Đang xóa các chỉ mục
- Cắt bớt đống
- Thực hiện dọn dẹp lần cuối
Chế độ xem này có sẵn trong PostgreSQL 12, cung cấp thông tin sau:
postgres=# \d pg_stat_progress_vacuum ;
View "pg_catalog.pg_stat_progress_vacuum"
Column | Type | Collation | Nullable | Default
--------------------+---------+-----------+----------+---------
pid | integer | | |
datid | oid | | |
datname | name | | |
relid | oid | | |
phase | text | | |
heap_blks_total | bigint | | |
heap_blks_scanned | bigint | | |
heap_blks_vacuumed | bigint | | |
index_vacuum_count | bigint | | |
max_dead_tuples | bigint | | |
num_dead_tuples | bigint | | |
Ví dụ:
postgres=# create table test ( a int, b varchar(40), c timestamp );
CREATE TABLE
postgres=# insert into test ( a, b, c ) select aa, bb, cc from generate_series(1,10000000) aa, md5(aa::varchar) bb, now() cc;
INSERT 0 10000000
postgres=# DELETE FROM test WHERE mod(a,6) = 0;
DELETE 1666666
Phiên 1:
postgres=# vacuum verbose test;
[. . . waits for completion . . .]
Phiên 2:
postgres=# select * from pg_stat_progress_vacuum;
-[ RECORD 1 ]------+--------------
pid | 22800
datid | 14187
datname | postgres
relid | 16388
phase | scanning heap
heap_blks_total | 93458
heap_blks_scanned | 80068
heap_blks_vacuumed | 80067
index_vacuum_count | 0
max_dead_tuples | 291
num_dead_tuples | 18
Báo cáo tiến độ cho CLUSTER và VACUUM FULL
Lệnh CLUSTER và VACUUM FULL sử dụng các đường dẫn mã giống nhau để ghi lại quan hệ, vì vậy bạn có thể kiểm tra tiến trình của cả hai lệnh bằng cách sử dụng chế độ xem pg_stat_progress_cluster.
Chế độ xem này có sẵn trong PostgreSQL 12 và nó hiển thị thông tin sau:
postgres=# \d pg_stat_progress_cluster
View "pg_catalog.pg_stat_progress_cluster"
Column | Type | Collation | Nullable | Default
---------------------+---------+-----------+----------+---------
pid | integer | | |
datid | oid | | |
datname | name | | |
relid | oid | | |
command | text | | |
phase | text | | |
cluster_index_relid | bigint | | |
heap_tuples_scanned | bigint | | |
heap_tuples_written | bigint | | |
heap_blks_total | bigint | | |
heap_blks_scanned | bigint | | |
index_rebuild_count | bigint | | |
Các giai đoạn hoạt động của Lệnh CLUSTER
- Đang khởi chạy
- đống quét tuần tự
- đống quét chỉ mục
- Sắp xếp các bộ giá trị
- Đang viết heap mới
- Hoán đổi các tệp quan hệ
- Xây dựng lại chỉ mục
- Thực hiện dọn dẹp lần cuối
Ví dụ:
postgres=# create table test as select a,md5(a::text) as txt, now() as date from generate_series(1,3000000) a;
SELECT 3000000
postgres=# create index idx1 on test(a);
CREATE INDEX
postgres=# create index idx2 on test(txt);
CREATE INDEX
postgres=# create index idx3 on test(date);
CREATE INDEX
Now execute the CLUSTER table command and see the progress in pg_stat_progress_cluster.
Phiên 1:
postgres=# cluster verbose test using idx1;
[. . . waits for completion . . .]
Phiên 2:
postgres=# select * from pg_stat_progress_cluster;
pid | datid | datname | relid | command | phase | cluster_index_relid | heap_tuples_scanned | heap_tuples_written | heap_blks_total | heap_blks_scanned | index_rebuild_count
------+-------+----------+-------+---------+------------------+---------------------+---------------------+---------------------+-----------------+-------------------+---------------------
1273 | 13586 | postgres | 15672 | CLUSTER | rebuilding index | 15680 | 3000000 | 3000000 | 0 | 0 | 2
(1 row)
Báo cáo Tiến độ cho CREATE INDEX và REINDEX
Bất cứ khi nào lệnh CREATE INDEX hoặc REINDEX đang chạy, dạng xem pg_stat_progress_create_index sẽ chứa một hàng cho mỗi chương trình phụ trợ hiện đang tạo chỉ mục. Tính năng báo cáo tiến độ cũng cho phép theo dõi các hương vị HIỆN TẠI CỦA CREATE INDEX và REINDEX. Các giai đoạn thực thi bên trong của lệnh CREATE INDEX và REINDEX giống nhau, vì vậy bạn có thể kiểm tra tiến trình của cả hai lệnh bằng cách sử dụng cùng một chế độ xem.
postgres=# \d pg_stat_progress_create_index
View "pg_catalog.pg_stat_progress_create_index"
Column | Type | Collation | Nullable | Default
--------------------+---------+-----------+----------+---------
pid | integer | | |
datid | oid | | |
datname | name | | |
relid | oid | | |
phase | text | | |
lockers_total | bigint | | |
lockers_done | bigint | | |
current_locker_pid | bigint | | |
blocks_total | bigint | | |
blocks_done | bigint | | |
tuples_total | bigint | | |
tuples_done | bigint | | |
partitions_total | bigint | | |
partitions_done | bigint | | |
Các giai đoạn hoạt động của CREATE INDEX / REINDEX
- Đang khởi chạy
- Chờ người viết trước khi xây dựng
- Xây dựng chỉ mục
- Chờ người viết trước khi xác thực
- Xác thực chỉ mục:quét chỉ mục
- Xác thực chỉ mục:sắp xếp các bộ giá trị
- Xác thực chỉ mục:quét bảng
- Đang đợi ảnh chụp nhanh cũ
- Chờ người đọc trước khi đánh dấu là đã chết
- Chờ người đọc trước khi bỏ qua
Ví dụ:
postgres=# create table test ( a int, b varchar(40), c timestamp );
CREATE TABLE
postgres=# insert into test ( a, b, c ) select aa, bb, cc from generate_series(1,10000000) aa, md5(aa::varchar) bb, now() cc;
INSERT 0 10000000
postgres=# CREATE INDEX idx ON test (b);
CREATE INDEX
Phiên 1:
postgres=# CREATE INDEX idx ON test (b);
[. . . waits for completion . . .]
Phiên 2:
postgres=# SELECT * FROM pg_stat_progress_create_index;
-[ RECORD 1 ]------+-------------------------------
pid | 19432
datid | 14187
datname | postgres
relid | 16405
index_relid | 0
command | CREATE INDEX
phase | building index: scanning table
lockers_total | 0
lockers_done | 0
current_locker_pid | 0
blocks_total | 93458
blocks_done | 46047
tuples_total | 0
tuples_done | 0
partitions_total | 0
partitions_done | 0
postgres=# SELECT * FROM pg_stat_progress_create_index;
-[ RECORD 1 ]------+---------------------------------------
pid | 19432
datid | 14187
datname | postgres
relid | 16405
index_relid | 0
command | CREATE INDEX
phase | building index: loading tuples in tree
lockers_total | 0
lockers_done | 0
current_locker_pid | 0
blocks_total | 0
blocks_done | 0
tuples_total | 10000000
tuples_done | 4346240
partitions_total | 0
partitions_done | 0
Kết luận
PostgreSQL phiên bản 9.6 trở đi có khả năng báo cáo tiến trình của các lệnh nhất định trong quá trình thực thi lệnh. Đây là một tính năng thực sự hay dành cho DBA’s, Nhà phát triển và người dùng để kiểm tra tiến trình của các lệnh đang chạy trong thời gian dài. Khả năng báo cáo này có thể mở rộng cho một số lệnh khác trong tương lai. Bạn có thể đọc thêm về tính năng mới này trong tài liệu PostgreSQL.