PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Peningkatan Pelaporan Kemajuan di PostgreSQL 12

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

  1. Inisialisasi
  2. Memindai tumpukan
  3. Vacuuming indeks
  4. Menghisap debu tumpukan
  5. Membersihkan indeks
  6. Memotong tumpukan
  7. 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

  1. Inisialisasi
  2. Heap pemindaian berurutan
  3. Heap pemindaian indeks
  4. Mengurutkan tupel
  5. Menulis tumpukan baru
  6. Bertukar file relasi
  7. Membangun kembali indeks
  8. 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

  1. Inisialisasi
  2. Menunggu penulis sebelum membangun
  3. Membangun indeks
  4. Menunggu penulis sebelum validasi
  5. Validasi indeks:indeks pemindaian
  6. Validasi indeks:  tupel pengurutan
  7. Validasi indeks:tabel pemindaian
  8. Menunggu cuplikan lama
  9. Menunggu pembaca sebelum menandai mati
  10. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql json menyukai kueri

  2. Cara Memisahkan String di PostgreSQL

  3. Menerapkan dan Mengelola PostgreSQL 11:Baru di ClusterControl 1.7.1

  4. psycopg2 setara dengan mysqldb.escape_string?

  5. 3 Cara Memformat Angka sebagai Persentase di PostgreSQL