PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Các cải tiến về báo cáo tiến độ trong PostgreSQL 12

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

  1. Đang khởi chạy
  2. Đang quét đống
  3. Chỉ mục hút bụi
  4. Đang hút bụi
  5. Đang xóa các chỉ mục
  6. Cắt bớt đống
  7. 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

  1. Đang khởi chạy
  2. đống quét tuần tự
  3. đống quét chỉ mục
  4. Sắp xếp các bộ giá trị
  5. Đang viết heap mới
  6. Hoán đổi các tệp quan hệ
  7. Xây dựng lại chỉ mục
  8. 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

  1. Đang khởi chạy
  2. Chờ người viết trước khi xây dựng
  3. Xây dựng chỉ mục
  4. Chờ người viết trước khi xác thực
  5. Xác thực chỉ mục:quét chỉ mục
  6. Xác thực chỉ mục:sắp xếp các bộ giá trị
  7. Xác thực chỉ mục:quét bảng
  8. Đang đợi ảnh chụp nhanh cũ
  9. Chờ người đọc trước khi đánh dấu là đã chết
  10. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi từ SQLite sang PostgreSQL trong một dự án Rails mới

  2. Hội thảo trên web:Các tính năng mới trong Postgres 12 [Theo dõi]

  3. Xuất các hàng cụ thể từ bảng PostgreSQL dưới dạng INSERT SQL script

  4. Làm cách nào để thay đổi loại cột trong Heroku?

  5. INSERT RETURNING có đảm bảo trả lại hàng theo đúng thứ tự không?