sql >> Databasteknik >  >> RDS >> PostgreSQL

Förbättringar av framstegsrapportering i PostgreSQL 12

I PostgreSQL kan många DDL-kommandon ta mycket lång tid att köra. PostgreSQL har förmågan att rapportera utvecklingen av DDL-kommandon under kommandoexekvering. Sedan PostgreSQL 9.6 har det varit möjligt att övervaka framstegen för att köra manuellt VACUUM och autovacuum med hjälp av en dedikerad systemkatalog (kallad pg_stat_progress_vacuum).

PostgreSQL 12 har lagt till stöd för att övervaka framstegen för några fler kommandon som CLUSTER, VACUUM FULL, CREATE INDEX och REINDEX.

För närvarande är funktionen för förloppsrapportering endast tillgänglig för kommandon enligt nedan.

  • VACUUM-kommando
  • KLUSTER-kommando
  • VACUUM FULL-kommandot
  • CREATE INDEX-kommandot
  • REINDEX-kommando

Varför är funktionen för framstegsrapportering i PostgreSQL viktig?

Denna funktion är mycket viktig för operatörer när de utför långa operationer, eftersom det är möjligt att inte blint vänta på att en operation ska avslutas.

Det här är en mycket användbar funktion för att få lite insikt som:

  • Hur mycket arbete totalt finns
  • Hur mycket arbete som redan gjorts 

Funktionen för förloppsrapportering är också användbar när man gör analys av prestandaarbetsbelastning, detta har också visat sig vara användbart för att utvärdera VACUUM-jobbbearbetning för att justera parametrar på systemnivå eller relationsnivå en gång beroende på belastningsmönster.

Kommandon som stöds och systemkatalog

DDL-kommando

Systemkatalog

PostgreSQL-version som stöds

VAKUUM

pg_stat_progress_vacuum

9.6

VAKUUM FULL

pg_stat_progress_cluster

12

KLUSTER

pg_stat_progress_cluster

12

SKAPA INDEX

pg_stat_progress_create_index

12

REINDEX

pg_stat_progress_create_index

12

Hur man övervakar framstegen för VACUUM-kommandot

När VACUUM-kommandot körs kommer vyn pg_stat_progress_vacuum att innehålla en rad för varje backend (inklusive processer för autovacuum) som för närvarande dammsuger. Vyn för att kontrollera framstegen för att köra VACUUM- och VACCUM FULL-kommandon är olika eftersom operationsfaserna för båda kommandona är olika.

Operationsfaser för VACUUM-kommandot

  1. Initialiserar
  2. Skanningshög
  3. Dammsugningsindex
  4. Dammsugningshög
  5. Rensa upp index
  6. Truncating heap
  7. Utför slutstädning

Denna vy är tillgänglig i PostgreSQL 12 som ger följande information:

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  |           |          |

Exempel:

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

Session 1:

postgres=# vacuum verbose test;

[. . . waits for completion . . .]

Session 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

Förloppsrapportering för CLUSTER och VACUUM FULL

KLUSTER- och VACUUM FULL-kommandot använder samma kodsökvägar för relationsomskrivningen, så att du kan kontrollera förloppet för båda kommandona med hjälp av vyn pg_stat_progress_cluster.

Denna vy är tillgänglig i PostgreSQL 12 och den visar följande information: 

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  |           |          | 

Operationsfaser för CLUSTER Command

  1. Initialiserar
  2. Seq scanning heap
  3. Indexsökningshög
  4. Sortera tuplar
  5. Skriver ny hög
  6. Byte av relationsfiler
  7. Återuppbyggnad av index
  8. Utför slutstädning

Exempel:

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. 

Session 1:

postgres=# cluster verbose test using idx1;

[. . . waits for completion . . .]

Session 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)

Förloppsrapportering för CREATE INDEX och REINDEX

När kommandot CREATE INDEX eller REINDEX körs kommer vyn pg_stat_progress_create_index att innehålla en rad för varje backend som för närvarande skapar index. Funktionen för förloppsrapportering gör det möjligt att spåra även smakerna av CREATE INDEX och REINDEX. De interna exekveringsfaserna för CREATE INDEX- och REINDEX-kommandona är desamma, så du kan kontrollera förloppet för båda kommandona med samma vy.

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  |           |          | 

Driftsfaser för CREATE INDEX / REINDEX

  1. Initialiserar
  2. Väntar på författare innan bygget
  3. Byggindex
  4. Väntar på skribenter innan validering
  5. Indexvalidering:skanningsindex
  6. Indexvalidering:  sortering av tuplar
  7. Indexvalidering:skanningstabell
  8. Väntar på gamla ögonblicksbilder
  9. Väntar på läsare innan de markeras som döda
  10. Väntar på läsare innan de släpper

Exempel:

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

Session 1:

postgres=# CREATE INDEX idx ON test (b);

[. . . waits for completion . . .]

Session 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

Slutsats

PostgreSQL version 9.6 och framåt har förmågan att rapportera framstegen för vissa kommandon under kommandoexekveringen. Detta är en riktigt trevlig funktion för DBA:er, utvecklare och användare för att kontrollera hur långa kommandon fortskrider. Den här rapporteringsmöjligheten kan utökas för vissa andra kommandon i framtiden. Du kan läsa mer om denna nya funktion i PostgreSQL-dokumentationen.


  1. Vilka är fördelarna och nackdelarna med att behålla SQL i lagrade processer kontra kod

  2. Patchhistoriktabeller i Oracle Apps (11i/R12.1/R12.2)

  3. Oracle Database TLS1.2 / SSL-anslutning med JDBC thin och JKS

  4. Hur jag skapar installationsprogram för webbplatsen. PHP mysql