Di PostgreSQL, banyak perintah DDL membutuhkan waktu yang sangat lama untuk dieksekusi. PostgreSQL memiliki kemampuan untuk melaporkan kemajuan perintah DDL selama eksekusi perintah. Sejak PostgreSQL 9.6, telah dimungkinkan untuk memantau kemajuan menjalankan VACUUM manual dan autovacuum menggunakan katalog sistem khusus (disebut pg_stat_progress_vacuum).
PostgreSQL 12 telah menambahkan dukungan untuk memantau kemajuan beberapa perintah lainnya seperti CLUSTER, VACUUM FULL, CREATE INDEX, dan REINDEX.
Saat ini, fasilitas pelaporan kemajuan hanya tersedia untuk perintah seperti di bawah ini.
- perintah VAKUM
- perintah CLUSTER
- Perintah LENGKAP VAKUM
- perintah CREATE INDEX
- perintah REINDEX
Mengapa Fitur Pelaporan Kemajuan di PostgreSQL Penting?
Fitur ini sangat penting bagi operator saat melakukan beberapa operasi yang berjalan lama, karena dimungkinkan untuk tidak menunggu secara membabi buta sampai operasi selesai.
Ini adalah fitur yang sangat berguna untuk mendapatkan wawasan seperti:
- Berapa total pekerjaan yang ada
- Berapa banyak pekerjaan yang sudah dilakukan
Fitur pelaporan kemajuan juga berguna saat melakukan analisis beban kerja kinerja, ini juga terbukti berguna dalam mengevaluasi pemrosesan pekerjaan VACUUM untuk menyetel parameter tingkat sistem atau tingkat hubungan sekali tergantung pada pola beban.
Perintah yang Didukung dan katalog sistem
Perintah DDL | Katalog Sistem | Versi PostgreSQL yang Didukung |
VACUUM | pg_stat_progress_vacuum | 9,6 |
VACUUM FULL | pg_stat_progress_cluster | 12 |
CLUSTER | pg_stat_progress_cluster | 12 |
BUAT INDEKS | pg_stat_progress_create_index | 12 |
REINDEX | pg_stat_progress_create_index | 12 |
Cara Memantau Kemajuan Perintah VACUUM
Setiap kali perintah VACUUM dijalankan, tampilan pg_stat_progress_vacuum akan berisi satu baris untuk setiap backend (termasuk proses pekerja autovacuum) yang saat ini sedang menyedot debu. Tampilan untuk memeriksa progres menjalankan perintah VACUUM dan VACCUM FULL berbeda karena fase operasi kedua perintah berbeda.
Fase Operasi Perintah VACUUM
- Inisialisasi
- Memindai tumpukan
- Vacuuming indeks
- Menghisap debu tumpukan
- Membersihkan indeks
- Memotong tumpukan
- Melakukan pembersihan akhir
Tampilan ini tersedia di PostgreSQL 12 yang memberikan informasi berikut:
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 | | |
Contoh:
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
Sesi 1:
postgres=# vacuum verbose test;
[. . . waits for completion . . .]
Sesi 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
Pelaporan kemajuan untuk CLUSTER dan VACUUM FULL
Perintah CLUSTER dan VACUUM FULL menggunakan jalur kode yang sama untuk penulisan ulang relasi, sehingga Anda dapat memeriksa kemajuan kedua perintah menggunakan tampilan pg_stat_progress_cluster.
Tampilan ini tersedia di PostgreSQL 12 dan menampilkan informasi berikut:
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 | | |
Tahap Operasi Perintah CLUSTER
- Inisialisasi
- Heap pemindaian berurutan
- Heap pemindaian indeks
- Mengurutkan tupel
- Menulis tumpukan baru
- Bertukar file relasi
- Membangun kembali indeks
- Melakukan pembersihan akhir
Contoh:
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.
Sesi 1:
postgres=# cluster verbose test using idx1;
[. . . waits for completion . . .]
Sesi 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)
Pelaporan Kemajuan untuk CREATE INDEX dan REINDEX
Setiap kali perintah CREATE INDEX atau REINDEX dijalankan, tampilan pg_stat_progress_create_index akan berisi satu baris untuk setiap backend yang sedang membuat indeks. Fitur pelaporan kemajuan memungkinkan untuk melacak juga rasa CONCURRENTLY dari CREATE INDEX dan REINDEX. Fase eksekusi internal perintah CREATE INDEX dan REINDEX adalah sama, sehingga Anda dapat memeriksa kemajuan kedua perintah menggunakan tampilan yang sama.
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 | | |
Tahap Operasi CREATE INDEX / REINDEX
- Inisialisasi
- Menunggu penulis sebelum membangun
- Membangun indeks
- Menunggu penulis sebelum validasi
- Validasi indeks:indeks pemindaian
- Validasi indeks: tupel pengurutan
- Validasi indeks:tabel pemindaian
- Menunggu cuplikan lama
- Menunggu pembaca sebelum menandai mati
- Menunggu pembaca sebelum mampir
Contoh:
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
Sesi 1:
postgres=# CREATE INDEX idx ON test (b);
[. . . waits for completion . . .]
Sesi 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
Kesimpulan
PostgreSQL versi 9.6 dan seterusnya memiliki kemampuan untuk melaporkan kemajuan perintah tertentu selama eksekusi perintah. Ini adalah fitur yang sangat bagus untuk DBA, Pengembang, dan pengguna untuk memeriksa kemajuan perintah yang berjalan lama. Kemampuan pelaporan ini dapat diperluas untuk beberapa perintah lain di masa mendatang. Anda dapat membaca lebih lanjut tentang fitur baru ini di dokumentasi PostgreSQL.