vacuum_file.diff.no-cfbot
text/plain
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index aa84f30443..0da1df97ec 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -243,9 +243,6 @@ typedef struct LVExtStatCounters
PGRUsage ru;
WalUsage walusage;
BufferUsage bufusage;
- int64 VacuumPageMiss;
- int64 VacuumPageHit;
- int64 VacuumPageDirty;
double VacuumDelayTime;
PgStat_Counter blocks_fetched;
PgStat_Counter blocks_hit;
@@ -332,9 +329,6 @@ extvac_stats_start(Relation rel, LVExtStatCounters *counters)
counters->time = starttime;
counters->walusage = pgWalUsage;
counters->bufusage = pgBufferUsage;
- counters->VacuumPageMiss = VacuumPageMiss;
- counters->VacuumPageHit = VacuumPageHit;
- counters->VacuumPageDirty = VacuumPageDirty;
counters->VacuumDelayTime = VacuumDelayTime;
counters->blocks_fetched = 0;
counters->blocks_hit = 0;
@@ -382,9 +376,9 @@ extvac_stats_end(Relation rel, LVExtStatCounters *counters,
/*
* Fill additional statistics on a vacuum processing operation.
*/
- report->total_blks_read = VacuumPageMiss - counters->VacuumPageMiss;
- report->total_blks_hit = VacuumPageHit - counters->VacuumPageHit;
- report->total_blks_dirtied = VacuumPageDirty - counters->VacuumPageDirty;
+ report->total_blks_read = bufusage.local_blks_read + bufusage.shared_blks_read;
+ report->total_blks_hit = bufusage.local_blks_hit + bufusage.shared_blks_hit;
+ report->total_blks_dirtied = bufusage.local_blks_dirtied + bufusage.shared_blks_dirtied;
report->total_blks_written = bufusage.shared_blks_written;
report->wal_records = walusage.wal_records;
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index 7f585f758f..e3aaa6ba0e 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -1492,8 +1492,7 @@ SELECT
stats.interrupts
FROM
- pg_database db,
- pg_namespace ns,
- pg_stats_vacuum_database(db.oid) stats
-WHERE
- db.datname = current_database();
+ pg_database db LEFT JOIN pg_stats_vacuum_database(db.oid) stats
+ON
+ db.oid = stats.dboid;
+
diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c
index dedb02963a..f421489241 100644
--- a/src/backend/commands/vacuumparallel.c
+++ b/src/backend/commands/vacuumparallel.c
@@ -1046,7 +1046,7 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc)
VacuumPageHit = 0;
VacuumPageMiss = 0;
VacuumPageDirty = 0;
- VacuumDelayTime = 0.;
+ VacuumDelayTime = 0;
VacuumCostBalanceLocal = 0;
VacuumSharedCostBalance = &(shared->cost_balance);
VacuumActiveNWorkers = &(shared->active_nworkers);
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index a778e5b2fe..50d8f5752a 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -2059,7 +2059,7 @@ fetch_dbstat_tabentry(Oid dbid, Oid relid)
pgstat_clear_snapshot();
- /* Tricky turn here: enforce pgstat to think that our database us dbid */
+ /* Tricky turn here: enforce pgstat to think that our database has dbid */
MyDatabaseId = dbid;
@@ -2281,6 +2281,7 @@ pg_stats_vacuum(FunctionCallInfo fcinfo, ExtVacReportType type, int ncolumns)
if (dbentry == NULL)
/* Table doesn't exist or isn't a heap relation */
PG_RETURN_NULL();
+
tuplestore_put_for_database(dbid, tupstore, tupdesc, dbentry, ncolumns);
pgstat_unlock_entry(entry_ref);
}
diff --git a/src/test/isolation/expected/vacuum-extended-statistic.out b/src/test/isolation/expected/vacuum-extended-statistic.out
index 83333b7dd2..02b93a6dba 100644
--- a/src/test/isolation/expected/vacuum-extended-statistic.out
+++ b/src/test/isolation/expected/vacuum-extended-statistic.out
@@ -1,419 +1,68 @@
-Parsed test spec with 1 sessions
-
-starting permutation: s1_insert s1_print_vacuum_stats_tables s1_print_vacuum_stats_indexes s1_set_agressive_vacuum s1_analyze s1_delete_half_table s1_print_vacuum_stats_tables s1_print_vacuum_stats_indexes s1_checkpoint s1_vacuum s1_print_vacuum_stats_tables s1_print_vacuum_stats_indexes s1_delete_full_table s1_checkpoint s1_vacuum_parallel s1_print_vacuum_stats_tables s1_print_vacuum_stats_indexes s1_insert s1_update s1_checkpoint s1_vacuum_full s1_print_vacuum_stats_tables s1_print_vacuum_stats_indexes s1_checkpoint s1_delete_full_table s1_trancate s1_checkpoint s1_vacuum s1_print_vacuum_stats_tables s1_print_vacuum_stats_indexes
-step s1_insert: INSERT INTO vestat(x) SELECT id FROM generate_series(1,770) As id;
-step s1_print_vacuum_stats_tables:
- SELECT vt.relname,
- pages_frozen,
- tuples_deleted,
- pages_scanned,
- pages_removed
+unused step name: s2_delete_full_table
+Parsed test spec with 2 sessions
+
+starting permutation: s2_insert s2_print_vacuum_stats_table s1_begin_repeatable_read s2_update s2_insert_interrupt s2_vacuum s2_print_vacuum_stats_table s1_commit s2_checkpoint s2_vacuum s2_print_vacuum_stats_table
+step s2_insert: INSERT INTO test_vacuum_stat_isolation(id, ival) SELECT ival, ival%10 FROM generate_series(1,1000) As ival;
+step s2_print_vacuum_stats_table:
+ SELECT
+ vt.relname, vt.tuples_deleted, vt.dead_tuples
FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid;
-
-relname|pages_frozen|tuples_deleted|pages_scanned|pages_removed
--------+------------+--------------+-------------+-------------
-(0 rows)
-
-step s1_print_vacuum_stats_indexes:
- SELECT vt.relname,
- pages_deleted,
- tuples_deleted
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid;
-
-relname|pages_deleted|tuples_deleted
--------+-------------+--------------
-(0 rows)
-
-step s1_set_agressive_vacuum: SET vacuum_freeze_min_age = 0;
-step s1_analyze: ANALYZE vestat;
-step s1_delete_half_table: DELETE FROM vestat WHERE x % 2 = 0;
-step s1_print_vacuum_stats_tables:
- SELECT vt.relname,
- pages_frozen,
- tuples_deleted,
- pages_scanned,
- pages_removed
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid;
-
-relname|pages_frozen|tuples_deleted|pages_scanned|pages_removed
--------+------------+--------------+-------------+-------------
-(0 rows)
-
-step s1_print_vacuum_stats_indexes:
- SELECT vt.relname,
- pages_deleted,
- tuples_deleted
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid;
+ WHERE vt.relname = 'test_vacuum_stat_isolation' AND vt.relid = c.oid;
-relname|pages_deleted|tuples_deleted
--------+-------------+--------------
+relname|tuples_deleted|dead_tuples
+-------+--------------+-----------
(0 rows)
-step s1_checkpoint: CHECKPOINT;
-step s1_vacuum: VACUUM vestat;
-step s1_print_vacuum_stats_tables:
- SELECT vt.relname,
- pages_frozen,
- tuples_deleted,
- pages_scanned,
- pages_removed
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid;
+step s1_begin_repeatable_read:
+ BEGIN transaction ISOLATION LEVEL REPEATABLE READ;
+ select count(ival) from test_vacuum_stat_isolation where id>900;
-relname|pages_frozen|tuples_deleted|pages_scanned|pages_removed
--------+------------+--------------+-------------+-------------
-vestat | 4| 385| 4| 0
+count
+-----
+ 100
(1 row)
-step s1_print_vacuum_stats_indexes:
- SELECT vt.relname,
- pages_deleted,
- tuples_deleted
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid;
-
-relname |pages_deleted|tuples_deleted
------------+-------------+--------------
-vestat_pkey| 0| 385
-(1 row)
-
-step s1_delete_full_table: DELETE FROM vestat;
-step s1_checkpoint: CHECKPOINT;
-step s1_vacuum_parallel: VACUUM (PARALLEL 2, INDEX_CLEANUP ON) vestat;
-step s1_print_vacuum_stats_tables:
- SELECT vt.relname,
- pages_frozen,
- tuples_deleted,
- pages_scanned,
- pages_removed
+step s2_update: UPDATE test_vacuum_stat_isolation SET ival = ival + 2 where id > 900;
+step s2_insert_interrupt: INSERT INTO test_vacuum_stat_isolation values (1,1);
+step s2_vacuum: VACUUM test_vacuum_stat_isolation;
+step s2_print_vacuum_stats_table:
+ SELECT
+ vt.relname, vt.tuples_deleted, vt.dead_tuples
FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid;
-
-relname|pages_frozen|tuples_deleted|pages_scanned|pages_removed
--------+------------+--------------+-------------+-------------
-vestat | 8| 770| 8| 4
-(1 row)
-
-step s1_print_vacuum_stats_indexes:
- SELECT vt.relname,
- pages_deleted,
- tuples_deleted
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid;
+ WHERE vt.relname = 'test_vacuum_stat_isolation' AND vt.relid = c.oid;
-relname |pages_deleted|tuples_deleted
------------+-------------+--------------
-vestat_pkey| 1| 770
+relname |tuples_deleted|dead_tuples
+--------------------------+--------------+-----------
+test_vacuum_stat_isolation| 0| 100
(1 row)
-step s1_insert: INSERT INTO vestat(x) SELECT id FROM generate_series(1,770) As id;
-step s1_update: UPDATE vestat SET x = x+1;
-ERROR: duplicate key value violates unique constraint "vestat_pkey"
-step s1_checkpoint: CHECKPOINT;
-step s1_vacuum_full: VACUUM FULL vestat;
-step s1_print_vacuum_stats_tables:
- SELECT vt.relname,
- pages_frozen,
- tuples_deleted,
- pages_scanned,
- pages_removed
+step s1_commit: COMMIT;
+step s2_checkpoint: CHECKPOINT;
+step s2_vacuum: VACUUM test_vacuum_stat_isolation;
+step s2_print_vacuum_stats_table:
+ SELECT
+ vt.relname, vt.tuples_deleted, vt.dead_tuples
FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid;
+ WHERE vt.relname = 'test_vacuum_stat_isolation' AND vt.relid = c.oid;
-relname|pages_frozen|tuples_deleted|pages_scanned|pages_removed
--------+------------+--------------+-------------+-------------
-vestat | 8| 770| 8| 4
+relname |tuples_deleted|dead_tuples
+--------------------------+--------------+-----------
+test_vacuum_stat_isolation| 100| 100
(1 row)
-step s1_print_vacuum_stats_indexes:
- SELECT vt.relname,
- pages_deleted,
- tuples_deleted
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid;
-relname |pages_deleted|tuples_deleted
------------+-------------+--------------
-vestat_pkey| 1| 770
-(1 row)
-
-step s1_checkpoint: CHECKPOINT;
-step s1_delete_full_table: DELETE FROM vestat;
-step s1_trancate: TRUNCATE vestat;
-step s1_checkpoint: CHECKPOINT;
-step s1_vacuum: VACUUM vestat;
-step s1_print_vacuum_stats_tables:
- SELECT vt.relname,
- pages_frozen,
- tuples_deleted,
- pages_scanned,
- pages_removed
+starting permutation: s2_insert s2_delete s2_vacuum s2_print_vacuum_stats_table
+step s2_insert: INSERT INTO test_vacuum_stat_isolation(id, ival) SELECT ival, ival%10 FROM generate_series(1,1000) As ival;
+step s2_delete: DELETE FROM test_vacuum_stat_isolation where id > 900;
+step s2_vacuum: VACUUM test_vacuum_stat_isolation;
+step s2_print_vacuum_stats_table:
+ SELECT
+ vt.relname, vt.tuples_deleted, vt.dead_tuples
FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid;
-
-relname|pages_frozen|tuples_deleted|pages_scanned|pages_removed
--------+------------+--------------+-------------+-------------
-vestat | 8| 770| 8| 4
-(1 row)
-
-step s1_print_vacuum_stats_indexes:
- SELECT vt.relname,
- pages_deleted,
- tuples_deleted
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid;
+ WHERE vt.relname = 'test_vacuum_stat_isolation' AND vt.relid = c.oid;
-relname |pages_deleted|tuples_deleted
------------+-------------+--------------
-vestat_pkey| 1| 770
+relname |tuples_deleted|dead_tuples
+--------------------------+--------------+-----------
+test_vacuum_stat_isolation| 100| 0
(1 row)
-
-starting permutation: s1_insert s1_set_agressive_vacuum s1_analyze s1_delete_half_table s1_checkpoint s1_difference s1_save_walls s1_checkpoint s1_vacuum s1_checkpoint s1_difference s1_save_walls s1_delete_full_table s1_checkpoint s1_vacuum_parallel s1_checkpoint s1_difference s1_save_walls s1_insert s1_update s1_checkpoint s1_vacuum_full s1_checkpoint s1_difference s1_save_walls s1_checkpoint s1_delete_full_table s1_trancate s1_vacuum s1_checkpoint s1_difference s1_save_walls
-step s1_insert: INSERT INTO vestat(x) SELECT id FROM generate_series(1,770) As id;
-step s1_set_agressive_vacuum: SET vacuum_freeze_min_age = 0;
-step s1_analyze: ANALYZE vestat;
-step s1_delete_half_table: DELETE FROM vestat WHERE x % 2 = 0;
-step s1_checkpoint: CHECKPOINT;
-step s1_difference:
- SELECT t1.wal_records - t0.wal_records > 0 AS dWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS dFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS dWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
- SELECT t1.wal_records - t0.wal_records > 0 AS iWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS iFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS iWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
-dwr|dfpi|dwb
----+----+---
-(0 rows)
-
-iwr|ifpi|iwb
----+----+---
-(0 rows)
-
-step s1_save_walls:
- UPDATE vacuum_wal_stats_table SET
- wal_records = dWR, wal_fpi = dFPI, wal_bytes = dWB
- FROM (SELECT relid, wal_records AS dWR, wal_fpi AS dFPI, wal_bytes AS dWB
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
- UPDATE vacuum_wal_stats_index SET
- wal_records = iWR, wal_fpi = iFPI, wal_bytes = iWB
- FROM (SELECT relid, wal_records AS iWR, wal_fpi AS iFPI, wal_bytes AS iWB
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
-step s1_checkpoint: CHECKPOINT;
-step s1_vacuum: VACUUM vestat;
-step s1_checkpoint: CHECKPOINT;
-step s1_difference:
- SELECT t1.wal_records - t0.wal_records > 0 AS dWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS dFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS dWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
- SELECT t1.wal_records - t0.wal_records > 0 AS iWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS iFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS iWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
-dwr|dfpi|dwb
----+----+---
-t |t |t
-(1 row)
-
-iwr|ifpi|iwb
----+----+---
-t |t |t
-(1 row)
-
-step s1_save_walls:
- UPDATE vacuum_wal_stats_table SET
- wal_records = dWR, wal_fpi = dFPI, wal_bytes = dWB
- FROM (SELECT relid, wal_records AS dWR, wal_fpi AS dFPI, wal_bytes AS dWB
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
- UPDATE vacuum_wal_stats_index SET
- wal_records = iWR, wal_fpi = iFPI, wal_bytes = iWB
- FROM (SELECT relid, wal_records AS iWR, wal_fpi AS iFPI, wal_bytes AS iWB
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
-step s1_delete_full_table: DELETE FROM vestat;
-step s1_checkpoint: CHECKPOINT;
-step s1_vacuum_parallel: VACUUM (PARALLEL 2, INDEX_CLEANUP ON) vestat;
-step s1_checkpoint: CHECKPOINT;
-step s1_difference:
- SELECT t1.wal_records - t0.wal_records > 0 AS dWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS dFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS dWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
- SELECT t1.wal_records - t0.wal_records > 0 AS iWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS iFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS iWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
-dwr|dfpi|dwb
----+----+---
-t |t |t
-(1 row)
-
-iwr|ifpi|iwb
----+----+---
-t |t |t
-(1 row)
-
-step s1_save_walls:
- UPDATE vacuum_wal_stats_table SET
- wal_records = dWR, wal_fpi = dFPI, wal_bytes = dWB
- FROM (SELECT relid, wal_records AS dWR, wal_fpi AS dFPI, wal_bytes AS dWB
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
- UPDATE vacuum_wal_stats_index SET
- wal_records = iWR, wal_fpi = iFPI, wal_bytes = iWB
- FROM (SELECT relid, wal_records AS iWR, wal_fpi AS iFPI, wal_bytes AS iWB
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
-step s1_insert: INSERT INTO vestat(x) SELECT id FROM generate_series(1,770) As id;
-step s1_update: UPDATE vestat SET x = x+1;
-ERROR: duplicate key value violates unique constraint "vestat_pkey"
-step s1_checkpoint: CHECKPOINT;
-step s1_vacuum_full: VACUUM FULL vestat;
-step s1_checkpoint: CHECKPOINT;
-step s1_difference:
- SELECT t1.wal_records - t0.wal_records > 0 AS dWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS dFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS dWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
- SELECT t1.wal_records - t0.wal_records > 0 AS iWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS iFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS iWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
-dwr|dfpi|dwb
----+----+---
-f |f |f
-(1 row)
-
-iwr|ifpi|iwb
----+----+---
-f |f |f
-(1 row)
-
-step s1_save_walls:
- UPDATE vacuum_wal_stats_table SET
- wal_records = dWR, wal_fpi = dFPI, wal_bytes = dWB
- FROM (SELECT relid, wal_records AS dWR, wal_fpi AS dFPI, wal_bytes AS dWB
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
- UPDATE vacuum_wal_stats_index SET
- wal_records = iWR, wal_fpi = iFPI, wal_bytes = iWB
- FROM (SELECT relid, wal_records AS iWR, wal_fpi AS iFPI, wal_bytes AS iWB
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
-step s1_checkpoint: CHECKPOINT;
-step s1_delete_full_table: DELETE FROM vestat;
-step s1_trancate: TRUNCATE vestat;
-step s1_vacuum: VACUUM vestat;
-step s1_checkpoint: CHECKPOINT;
-step s1_difference:
- SELECT t1.wal_records - t0.wal_records > 0 AS dWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS dFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS dWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
- SELECT t1.wal_records - t0.wal_records > 0 AS iWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS iFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS iWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
-dwr|dfpi|dwb
----+----+---
-t |f |t
-(1 row)
-
-iwr|ifpi|iwb
----+----+---
-t |f |t
-(1 row)
-
-step s1_save_walls:
- UPDATE vacuum_wal_stats_table SET
- wal_records = dWR, wal_fpi = dFPI, wal_bytes = dWB
- FROM (SELECT relid, wal_records AS dWR, wal_fpi AS dFPI, wal_bytes AS dWB
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
- UPDATE vacuum_wal_stats_index SET
- wal_records = iWR, wal_fpi = iFPI, wal_bytes = iWB
- FROM (SELECT relid, wal_records AS iWR, wal_fpi AS iFPI, wal_bytes AS iWB
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
diff --git a/src/test/isolation/expected/vacuum-extending.out b/src/test/isolation/expected/vacuum-extending-in-repetable-read.out
similarity index 72%
rename from src/test/isolation/expected/vacuum-extending.out
rename to src/test/isolation/expected/vacuum-extending-in-repetable-read.out
index 6516d31be6..b1a9cb90bc 100644
--- a/src/test/isolation/expected/vacuum-extending.out
+++ b/src/test/isolation/expected/vacuum-extending-in-repetable-read.out
@@ -1,3 +1,4 @@
+unused step name: s2_delete
Parsed test spec with 2 sessions
starting permutation: s2_insert s2_print_vacuum_stats_table s1_begin_repeatable_read s2_update s2_insert_interrupt s2_vacuum s2_print_vacuum_stats_table s1_commit s2_checkpoint s2_vacuum s2_print_vacuum_stats_table
@@ -49,20 +50,3 @@ relname |tuples_deleted|dead_tuples|tuples_frozen
test_vacuum_stat_isolation| 100| 100| 101
(1 row)
-
-starting permutation: s2_insert s2_delete s2_checkpoint s2_vacuum s2_print_vacuum_stats_table
-step s2_insert: INSERT INTO test_vacuum_stat_isolation(id, ival) SELECT ival, ival%10 FROM generate_series(1,1000) As ival;
-step s2_delete: DELETE FROM test_vacuum_stat_isolation where id > 900;
-step s2_checkpoint: CHECKPOINT;
-step s2_vacuum: VACUUM test_vacuum_stat_isolation;
-step s2_print_vacuum_stats_table:
- SELECT
- vt.relname, vt.tuples_deleted, vt.dead_tuples, vt.tuples_frozen
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'test_vacuum_stat_isolation' AND vt.relid = c.oid;
-
-relname |tuples_deleted|dead_tuples|tuples_frozen
---------------------------+--------------+-----------+-------------
-test_vacuum_stat_isolation| 100| 0| 222
-(1 row)
-
diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule
index 13e92bfc22..5bac4ddbe1 100644
--- a/src/test/isolation/isolation_schedule
+++ b/src/test/isolation/isolation_schedule
@@ -92,8 +92,7 @@ test: timeouts
test: vacuum-concurrent-drop
test: vacuum-conflict
test: vacuum-skip-locked
-test: vacuum-extending
-test: vacuum-extended-statistic
+test: vacuum-extending-in-repetable-read
test: stats
test: horizons
test: predicate-hash
diff --git a/src/test/isolation/specs/vacuum-extended-statistic.spec b/src/test/isolation/specs/vacuum-extended-statistic.spec
deleted file mode 100644
index f749be8b02..0000000000
--- a/src/test/isolation/specs/vacuum-extended-statistic.spec
+++ /dev/null
@@ -1,179 +0,0 @@
-# A number of tests dedicated to verification of the 'Extended Vacuum Statistics'
-# feature.
-# By default, statistics has a volatile nature. So, selection result can depend
-# on a bunch of things. Here some trivial tests are performed that should work
-# in the most cases.
-# Test for checking pages: frozen, scanned, removed, number of tuple_deleted in pgpro_stats_vacuum_tables.
-# Besides, this test check pages scanned, pages removed, tuples_deleted in pgpro_stats_vacuum_tables and
-# wal values statistic collected over vacuum operation as for tables as for indexes.
-
-setup
-{
- CREATE TABLE vestat (x int primary key) WITH (autovacuum_enabled = off);
-
- CREATE TABLE vacuum_wal_stats_table
- (relid int, wal_records int, wal_fpi int, wal_bytes int);
- insert into vacuum_wal_stats_table (relid)
- select oid from pg_class c
- WHERE relname = 'vestat';
- UPDATE vacuum_wal_stats_table SET
- wal_records = 0, wal_fpi = 0, wal_bytes = 0;
-
- CREATE TABLE vacuum_wal_stats_index
- (relid int, wal_records int, wal_fpi int, wal_bytes int);
- insert into vacuum_wal_stats_index (relid)
- select oid from pg_class c
- WHERE relname = 'vestat_pkey';
- UPDATE vacuum_wal_stats_index SET
- wal_records = 0, wal_fpi = 0, wal_bytes = 0;
-
- SET track_io_timing = on;
- SHOW track_counts; -- must be on
- SET track_functions TO 'all';
-
-}
-
-teardown
-{
- RESET vacuum_freeze_min_age;
- RESET vacuum_freeze_table_age;
- DROP TABLE vestat CASCADE;
- DROP TABLE vacuum_wal_stats_index;
- DROP TABLE vacuum_wal_stats_table;
-}
-
-session s1
-step s1_set_agressive_vacuum { SET vacuum_freeze_min_age = 0; }
-step s1_insert { INSERT INTO vestat(x) SELECT id FROM generate_series(1,770) As id; }
-step s1_update { UPDATE vestat SET x = x+1; }
-step s1_delete_half_table { DELETE FROM vestat WHERE x % 2 = 0; }
-step s1_delete_full_table { DELETE FROM vestat; }
-step s1_vacuum { VACUUM vestat; }
-step s1_vacuum_full { VACUUM FULL vestat; }
-step s1_vacuum_parallel { VACUUM (PARALLEL 2, INDEX_CLEANUP ON) vestat; }
-step s1_analyze { ANALYZE vestat; }
-step s1_trancate { TRUNCATE vestat; }
-step s1_checkpoint { CHECKPOINT; }
-step s1_print_vacuum_stats_tables
-{
- SELECT vt.relname,
- pages_frozen,
- tuples_deleted,
- pages_scanned,
- pages_removed
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid;
-}
-
-step s1_print_vacuum_stats_indexes
-{
- SELECT vt.relname,
- pages_deleted,
- tuples_deleted
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid;
-}
-
-step s1_save_walls
-{
- UPDATE vacuum_wal_stats_table SET
- wal_records = dWR, wal_fpi = dFPI, wal_bytes = dWB
- FROM (SELECT relid, wal_records AS dWR, wal_fpi AS dFPI, wal_bytes AS dWB
- FROM pg_stats_vacuum_tables vt, pg_class c
- WHERE vt.relname = 'vestat' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-
- UPDATE vacuum_wal_stats_index SET
- wal_records = iWR, wal_fpi = iFPI, wal_bytes = iWB
- FROM (SELECT relid, wal_records AS iWR, wal_fpi AS iFPI, wal_bytes AS iWB
- FROM pg_stats_vacuum_indexes vt, pg_class c
- WHERE vt.relname = 'vestat_pkey' AND
- vt.relid = c.oid) t
- WHERE
- t.relid = t.relid;
-}
-
-step s1_difference
-{
- SELECT t1.wal_records - t0.wal_records > 0 AS dWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS dFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS dWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-
- SELECT t1.wal_records - t0.wal_records > 0 AS iWR,
- t1.wal_fpi - t0.wal_fpi > 0 AS iFPI,
- t1.wal_bytes - t0.wal_bytes > 0 AS iWB
- FROM vacuum_wal_stats_table t0, pg_stats_vacuum_tables t1
- WHERE t0.relid = t1.relid;
-}
-
-permutation
- s1_insert
- s1_print_vacuum_stats_tables
- s1_print_vacuum_stats_indexes
- s1_set_agressive_vacuum
- s1_analyze
- s1_delete_half_table
- s1_print_vacuum_stats_tables
- s1_print_vacuum_stats_indexes
- s1_checkpoint
- s1_vacuum
- s1_print_vacuum_stats_tables
- s1_print_vacuum_stats_indexes
- s1_delete_full_table
- s1_checkpoint
- s1_vacuum_parallel
- s1_print_vacuum_stats_tables
- s1_print_vacuum_stats_indexes
- s1_insert
- s1_update
- s1_checkpoint
- s1_vacuum_full
- s1_print_vacuum_stats_tables
- s1_print_vacuum_stats_indexes
- s1_checkpoint
- s1_delete_full_table
- s1_trancate
- s1_checkpoint
- s1_vacuum
- s1_print_vacuum_stats_tables
- s1_print_vacuum_stats_indexes
-
-permutation
- s1_insert
- s1_set_agressive_vacuum
- s1_analyze
- s1_delete_half_table
- s1_checkpoint
- s1_difference
- s1_save_walls
- s1_checkpoint
- s1_vacuum
- s1_checkpoint
- s1_difference
- s1_save_walls
- s1_delete_full_table
- s1_checkpoint
- s1_vacuum_parallel
- s1_checkpoint
- s1_difference
- s1_save_walls
- s1_insert
- s1_update
- s1_checkpoint
- s1_vacuum_full
- s1_checkpoint
- s1_difference
- s1_save_walls
- s1_checkpoint
- s1_delete_full_table
- s1_trancate
- s1_vacuum
- s1_checkpoint
- s1_difference
- s1_save_walls
\ No newline at end of file
diff --git a/src/test/isolation/specs/vacuum-extending.spec b/src/test/isolation/specs/vacuum-extending-in-repetable-read.spec
similarity index 93%
rename from src/test/isolation/specs/vacuum-extending.spec
rename to src/test/isolation/specs/vacuum-extending-in-repetable-read.spec
index 9b4dac68a3..2fb6bf5b22 100644
--- a/src/test/isolation/specs/vacuum-extending.spec
+++ b/src/test/isolation/specs/vacuum-extending-in-repetable-read.spec
@@ -48,11 +48,4 @@ permutation
s1_commit
s2_checkpoint
s2_vacuum
- s2_print_vacuum_stats_table
-
-permutation
- s2_insert
- s2_delete
- s2_checkpoint
- s2_vacuum
s2_print_vacuum_stats_table
\ No newline at end of file
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 56a76f4569..08595b49da 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -2621,10 +2621,8 @@ pg_stats_vacuum_database| SELECT db.oid AS dboid,
stats.user_time,
stats.total_time,
stats.interrupts
- FROM pg_database db,
- pg_namespace ns,
- LATERAL pg_stats_vacuum_database(db.oid) stats(dboid, db_blks_read, db_blks_hit, total_blks_dirtied, total_blks_written, wal_records, wal_fpi, wal_bytes, blk_read_time, blk_write_time, delay_time, system_time, user_time, total_time, interrupts)
- WHERE (db.datname = current_database());
+ FROM (pg_database db
+ LEFT JOIN LATERAL pg_stats_vacuum_database(db.oid) stats(dboid, db_blks_read, db_blks_hit, total_blks_dirtied, total_blks_written, wal_records, wal_fpi, wal_bytes, blk_read_time, blk_write_time, delay_time, system_time, user_time, total_time, interrupts) ON ((db.oid = stats.dboid)));
pg_stats_vacuum_indexes| SELECT rel.oid AS relid,
ns.nspname AS schema,
rel.relname,
diff --git a/src/test/regress/expected/vacuum_index_statistics.out b/src/test/regress/expected/vacuum_index_statistics.out
new file mode 100644
index 0000000000..af7c194ae4
--- /dev/null
+++ b/src/test/regress/expected/vacuum_index_statistics.out
@@ -0,0 +1,207 @@
+--
+-- Test cumulative vacuum stats system
+--
+-- Check the wall statistics collected during vacuum operation:
+-- number of frozen and visible pages set by vacuum;
+-- number of frozen and visible pages removed by backend.
+-- Statistic wal_fpi is not displayed in this test because its behavior is unstable.
+--
+-- conditio sine qua non
+SHOW track_counts; -- must be on
+ track_counts
+--------------
+ on
+(1 row)
+
+-- not enabled by default, but we want to test it...
+SET track_functions TO 'all';
+-- ensure pending stats are flushed
+SELECT pg_stat_force_next_flush();
+ pg_stat_force_next_flush
+--------------------------
+
+(1 row)
+
+\set sample_size 10000
+SET vacuum_freeze_min_age = 0;
+SET vacuum_freeze_table_age = 0;
+--SET stats_fetch_consistency = snapshot;
+CREATE TABLE vestat (x int primary key) WITH (autovacuum_enabled = off, fillfactor = 10);
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+ANALYZE vestat;
+SELECT oid AS ioid from pg_class where relname = 'vestat_pkey' \gset
+DELETE FROM vestat WHERE x % 2 = 0;
+-- Before the first vacuum execution extended stats view is empty.
+SELECT vt.relname,relpages,pages_deleted,tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+ relname | relpages | pages_deleted | tuples_deleted
+---------+----------+---------------+----------------
+(0 rows)
+
+SELECT relpages AS irp
+FROM pg_class c
+WHERE relname = 'vestat_pkey' \gset
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP ON) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+-- The table and index extended vacuum statistics should show us that
+-- vacuum frozed pages and clean up pages, but pages_removed stayed the same
+-- because of not full table have cleaned up
+SELECT vt.relname,relpages-:irp = 0 AS relpages,pages_deleted = 0 AS pages_deleted,tuples_deleted > 0 AS tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+ relname | relpages | pages_deleted | tuples_deleted
+-------------+----------+---------------+----------------
+ vestat_pkey | t | t | t
+(1 row)
+
+SELECT vt.relname,relpages AS irp,pages_deleted AS ipd,tuples_deleted AS itd
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid \gset
+-- Store WAL advances into variables
+SELECT wal_records AS iwr,wal_bytes AS iwb,wal_fpi AS ifpi FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+-- Look into WAL records deltas.
+SELECT wal_records > 0 AS diWR, wal_bytes > 0 AS diWB
+FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey';
+ diwr | diwb
+------+------
+ t | t
+(1 row)
+
+DELETE FROM vestat;;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP ON) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+-- pages_removed must be increased
+SELECT vt.relname,relpages-:irp = 0 AS relpages,pages_deleted-:ipd > 0 AS pages_deleted,tuples_deleted-:itd > 0 AS tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+ relname | relpages | pages_deleted | tuples_deleted
+-------------+----------+---------------+----------------
+ vestat_pkey | t | t | t
+(1 row)
+
+SELECT vt.relname,relpages AS irp,pages_deleted AS ipd,tuples_deleted AS itd
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid \gset
+-- Store WAL advances into variables
+SELECT wal_records-:iwr AS diwr, wal_bytes-:iwb AS diwb, wal_fpi-:ifpi AS difpi
+FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+-- WAL advance should be detected.
+SELECT :diwr > 0 AS diWR, :diwb > 0 AS diWB;
+ diwr | diwb
+------+------
+ t | t
+(1 row)
+
+-- Store WAL advances into variables
+SELECT wal_records AS iwr,wal_bytes AS iwb,wal_fpi AS ifpi FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+DELETE FROM vestat WHERE x % 2 = 0;
+-- VACUUM FULL doesn't report to stat collector. So, no any advancements of statistics
+-- are detected here.
+VACUUM FULL vestat;
+-- It is necessary to check the wal statistics
+CHECKPOINT;
+-- Store WAL advances into variables
+SELECT wal_records-:iwr AS diwr2, wal_bytes-:iwb AS diwb2, wal_fpi-:ifpi AS difpi2
+FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+-- WAL and other statistics advance should not be detected.
+SELECT :diwr2=0 AS diWR, :difpi2=0 AS iFPI, :diwb2=0 AS diWB;
+ diwr | ifpi | diwb
+------+------+------
+ t | t | t
+(1 row)
+
+SELECT vt.relname,relpages-:irp < 0 AS relpages,pages_deleted-:ipd = 0 AS pages_deleted,tuples_deleted-:itd = 0 AS tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+ relname | relpages | pages_deleted | tuples_deleted
+-------------+----------+---------------+----------------
+ vestat_pkey | t | t | t
+(1 row)
+
+SELECT vt.relname,relpages AS irp,pages_deleted AS ipd,tuples_deleted AS itd
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid \gset
+-- Store WAL advances into variables
+SELECT wal_records AS iwr,wal_bytes AS iwb,wal_fpi AS ifpi FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+DELETE FROM vestat;
+TRUNCATE vestat;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP ON) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+-- Store WAL advances into variables after removing all tuples from the table
+SELECT wal_records-:iwr AS diwr3, wal_bytes-:iwb AS diwb3, wal_fpi-:ifpi AS difpi3
+FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+--There are nothing changed
+SELECT :diwr3=0 AS diWR, :difpi3=0 AS iFPI, :diwb3=0 AS diWB;
+ diwr | ifpi | diwb
+------+------+------
+ t | t | t
+(1 row)
+
+--
+-- Now, the table and index is compressed into zero number of pages. Check it
+-- in vacuum extended statistics.
+-- The pages_frozen, pages_scanned values shouldn't be changed
+--
+SELECT vt.relname,relpages-:irp = 0 AS relpages,pages_deleted-:ipd = 0 AS pages_deleted,tuples_deleted-:itd = 0 AS tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+ relname | relpages | pages_deleted | tuples_deleted
+-------------+----------+---------------+----------------
+ vestat_pkey | f | t | t
+(1 row)
+
+-- ensure pending stats are flushed
+SELECT pg_stat_force_next_flush();
+ pg_stat_force_next_flush
+--------------------------
+
+(1 row)
+
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+ANALYZE vestat;
+-- must be empty
+SELECT pages_frozen, pages_all_visible, rev_all_frozen_pages,rev_all_visible_pages
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+ pages_frozen | pages_all_visible | rev_all_frozen_pages | rev_all_visible_pages
+--------------+-------------------+----------------------+-----------------------
+ 910 | 910 | 455 | 455
+(1 row)
+
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) vestat;
+-- vacuum should freezed pages, but there is nothing to defreeze
+SELECT pages_frozen > 0 AS pages_frozen,pages_all_visible > 0 AS pages_all_visible,rev_all_frozen_pages = 0 AS rev_all_frozen_pages,rev_all_visible_pages = 0 AS rev_all_visible_pages
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+ pages_frozen | pages_all_visible | rev_all_frozen_pages | rev_all_visible_pages
+--------------+-------------------+----------------------+-----------------------
+ t | t | f | f
+(1 row)
+
+SELECT pages_frozen AS pf, pages_all_visible AS pv, rev_all_frozen_pages AS hafp,rev_all_visible_pages AS havp
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+UPDATE vestat SET x = x+1001;
+ERROR: duplicate key value violates unique constraint "vestat_pkey"
+DETAIL: Key (x)=(1002) already exists.
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) vestat;
+SELECT pages_frozen > :pf AS pages_frozen,pages_all_visible > :pv AS pages_all_visible,rev_all_frozen_pages > :hafp AS rev_all_frozen_pages,rev_all_visible_pages > :havp AS rev_all_visible_pages
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+ pages_frozen | pages_all_visible | rev_all_frozen_pages | rev_all_visible_pages
+--------------+-------------------+----------------------+-----------------------
+ f | f | f | f
+(1 row)
+
+SELECT pages_frozen AS pf, pages_all_visible AS pv, rev_all_frozen_pages AS hafp,rev_all_visible_pages AS havp
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) vestat;
+SELECT pages_frozen = :pf AS pages_frozen,pages_all_visible = :pv AS pages_all_visible,rev_all_frozen_pages = :hafp AS rev_all_frozen_pages,rev_all_visible_pages = :havp AS rev_all_visible_pages
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+ pages_frozen | pages_all_visible | rev_all_frozen_pages | rev_all_visible_pages
+--------------+-------------------+----------------------+-----------------------
+ t | t | t | t
+(1 row)
+
+DROP TABLE vestat;
diff --git a/src/test/regress/expected/vacuum_tables_and_db_statistics.out b/src/test/regress/expected/vacuum_tables_and_db_statistics.out
new file mode 100644
index 0000000000..e5b87144b0
--- /dev/null
+++ b/src/test/regress/expected/vacuum_tables_and_db_statistics.out
@@ -0,0 +1,236 @@
+--
+-- Test cumulative vacuum stats system
+--
+-- Check the wall statistics collected during vacuum operation:
+-- number of frozen and visible pages set by vacuum;
+-- number of frozen and visible pages removed by backend.
+-- Statistic wal_fpi is not displayed in this test because its behavior is unstable.
+--
+CREATE DATABASE statistic_vacuum_database;
+CREATE DATABASE statistic_vacuum_database1;
+\c statistic_vacuum_database;
+-- conditio sine qua non
+SHOW track_counts; -- must be on
+ track_counts
+--------------
+ on
+(1 row)
+
+-- not enabled by default, but we want to test it...
+SET track_functions TO 'all';
+-- ensure pending stats are flushed
+SELECT pg_stat_force_next_flush();
+ pg_stat_force_next_flush
+--------------------------
+
+(1 row)
+
+\set sample_size 10000
+SET vacuum_freeze_min_age = 0;
+SET vacuum_freeze_table_age = 0;
+--SET stats_fetch_consistency = snapshot;
+CREATE TABLE vestat (x int) WITH (autovacuum_enabled = off, fillfactor = 10);
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+ANALYZE vestat;
+SELECT oid AS roid from pg_class where relname = 'vestat' \gset
+DELETE FROM vestat WHERE x % 2 = 0;
+-- Before the first vacuum execution extended stats view is empty.
+SELECT vt.relname,pages_frozen,tuples_deleted,relpages,pages_scanned,pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+ relname | pages_frozen | tuples_deleted | relpages | pages_scanned | pages_removed
+---------+--------------+----------------+----------+---------------+---------------
+(0 rows)
+
+SELECT relpages AS rp
+FROM pg_class c
+WHERE relname = 'vestat' \gset
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP OFF) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+-- The table and index extended vacuum statistics should show us that
+-- vacuum frozed pages and clean up pages, but pages_removed stayed the same
+-- because of not full table have cleaned up
+SELECT vt.relname,pages_frozen > 0 AS pages_frozen,tuples_deleted > 0 AS tuples_deleted,relpages-:rp = 0 AS relpages,pages_scanned > 0 AS pages_scanned,pages_removed = 0 AS pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+ relname | pages_frozen | tuples_deleted | relpages | pages_scanned | pages_removed
+---------+--------------+----------------+----------+---------------+---------------
+ vestat | f | t | t | t | t
+(1 row)
+
+SELECT pages_frozen AS fp,tuples_deleted AS td,relpages AS rp, pages_scanned AS ps, pages_removed AS pr
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid \gset
+-- Store WAL advances into variables
+SELECT wal_records AS hwr,wal_bytes AS hwb,wal_fpi AS hfpi FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+-- Look into WAL records deltas.
+SELECT wal_records > 0 AS dWR, wal_bytes > 0 AS dWB
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+ dwr | dwb
+-----+-----
+ t | t
+(1 row)
+
+DELETE FROM vestat;;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP OFF) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+-- pages_removed must be increased
+SELECT vt.relname,pages_frozen-:fp > 0 AS pages_frozen,tuples_deleted-:td > 0 AS tuples_deleted,relpages -:rp = 0 AS relpages,pages_scanned-:ps > 0 AS pages_scanned,pages_removed-:pr > 0 AS pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+ relname | pages_frozen | tuples_deleted | relpages | pages_scanned | pages_removed
+---------+--------------+----------------+----------+---------------+---------------
+ vestat | f | t | f | t | t
+(1 row)
+
+SELECT pages_frozen AS fp,tuples_deleted AS td,relpages AS rp, pages_scanned AS ps, pages_removed AS pr
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid \gset
+-- Store WAL advances into variables
+SELECT wal_records-:hwr AS dwr, wal_bytes-:hwb AS dwb, wal_fpi-:hfpi AS dfpi
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+-- WAL advance should be detected.
+SELECT :dwr > 0 AS dWR, :dwb > 0 AS dWB;
+ dwr | dwb
+-----+-----
+ t | t
+(1 row)
+
+-- Store WAL advances into variables
+SELECT wal_records AS hwr,wal_bytes AS hwb,wal_fpi AS hfpi FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+DELETE FROM vestat WHERE x % 2 = 0;
+-- VACUUM FULL doesn't report to stat collector. So, no any advancements of statistics
+-- are detected here.
+VACUUM FULL vestat;
+-- It is necessary to check the wal statistics
+CHECKPOINT;
+-- Store WAL advances into variables
+SELECT wal_records-:hwr AS dwr2, wal_bytes-:hwb AS dwb2, wal_fpi-:hfpi AS dfpi2
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+-- WAL and other statistics advance should not be detected.
+SELECT :dwr2=0 AS dWR, :dfpi2=0 AS dFPI, :dwb2=0 AS dWB;
+ dwr | dfpi | dwb
+-----+------+-----
+ t | t | t
+(1 row)
+
+SELECT vt.relname,pages_frozen-:fp = 0 AS pages_frozen,tuples_deleted-:td = 0 AS tuples_deleted,relpages -:rp < 0 AS relpages,pages_scanned-:ps = 0 AS pages_scanned,pages_removed-:pr = 0 AS pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+ relname | pages_frozen | tuples_deleted | relpages | pages_scanned | pages_removed
+---------+--------------+----------------+----------+---------------+---------------
+ vestat | t | t | f | t | t
+(1 row)
+
+SELECT pages_frozen AS fp,tuples_deleted AS td,relpages AS rp, pages_scanned AS ps,pages_removed AS pr
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid \gset
+-- Store WAL advances into variables
+SELECT wal_records AS hwr,wal_bytes AS hwb,wal_fpi AS hfpi FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+DELETE FROM vestat;
+TRUNCATE vestat;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP OFF) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+-- Store WAL advances into variables after removing all tuples from the table
+SELECT wal_records-:hwr AS dwr3, wal_bytes-:hwb AS dwb3, wal_fpi-:hfpi AS dfpi3
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+--There are nothing changed
+SELECT :dwr3>0 AS dWR, :dfpi3=0 AS dFPI, :dwb3>0 AS dWB;
+ dwr | dfpi | dwb
+-----+------+-----
+ t | t | t
+(1 row)
+
+--
+-- Now, the table and index is compressed into zero number of pages. Check it
+-- in vacuum extended statistics.
+-- The pages_frozen, pages_scanned values shouldn't be changed
+--
+SELECT vt.relname,pages_frozen-:fp = 0 AS pages_frozen,tuples_deleted-:td = 0 AS tuples_deleted,relpages -:rp = 0 AS relpages,pages_scanned-:ps = 0 AS pages_scanned,pages_removed-:pr = 0 AS pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+ relname | pages_frozen | tuples_deleted | relpages | pages_scanned | pages_removed
+---------+--------------+----------------+----------+---------------+---------------
+ vestat | t | t | f | t | t
+(1 row)
+
+-- Now check vacuum statistics for current database
+SELECT pg_database.datname,
+ db_blks_hit > 0 AS db_blks_hit,
+ total_blks_dirtied > 0 AS total_blks_dirtied,
+ total_blks_written > 0 AS total_blks_written,
+ wal_records > 0 AS wal_records,
+ wal_fpi > 0 AS wal_fpi,
+ wal_bytes > 0 AS wal_bytes,
+ user_time > 0 AS user_time,
+ total_time > 0 AS total_time
+FROM
+pg_stats_vacuum_database, pg_database
+WHERE pg_database.datname = current_database() and pg_database.oid = pg_stats_vacuum_database.dboid;
+ datname | db_blks_hit | total_blks_dirtied | total_blks_written | wal_records | wal_fpi | wal_bytes | user_time | total_time
+---------------------------+-------------+--------------------+--------------------+-------------+---------+-----------+-----------+------------
+ statistic_vacuum_database | t | t | t | t | t | t | t | t
+(1 row)
+
+DROP TABLE vestat CASCADE;
+-- ensure pending stats are flushed
+SELECT pg_stat_force_next_flush();
+ pg_stat_force_next_flush
+--------------------------
+
+(1 row)
+
+CREATE TABLE vestat (x int) WITH (autovacuum_enabled = off, fillfactor = 10);
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+ANALYZE vestat;
+UPDATE vestat SET x = x+10001;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) vestat;
+\c statistic_vacuum_database1;
+-- Now check vacuum statistics for postgres database from another database
+SELECT pg_database.datname,
+ db_blks_hit > 0 AS db_blks_hit,
+ total_blks_dirtied > 0 AS total_blks_dirtied,
+ total_blks_written > 0 AS total_blks_written,
+ wal_records > 0 AS wal_records,
+ wal_fpi > 0 AS wal_fpi,
+ wal_bytes > 0 AS wal_bytes,
+ user_time > 0 AS user_time,
+ total_time > 0 AS total_time
+FROM
+pg_stats_vacuum_database, pg_database
+WHERE pg_database.datname = 'statistic_vacuum_database' and pg_database.oid = pg_stats_vacuum_database.dboid;
+ datname | db_blks_hit | total_blks_dirtied | total_blks_written | wal_records | wal_fpi | wal_bytes | user_time | total_time
+---------------------------+-------------+--------------------+--------------------+-------------+---------+-----------+-----------+------------
+ statistic_vacuum_database | t | t | t | t | t | t | t | t
+(1 row)
+
+\c statistic_vacuum_database
+RESET vacuum_freeze_min_age;
+RESET vacuum_freeze_table_age;
+DROP TABLE vestat CASCADE;
+\c statistic_vacuum_database1;
+SELECT count(*)
+FROM pg_database d
+CROSS JOIN pg_stats_vacuum_tables(d.oid, 0)
+WHERE oid = 0; -- must be 0
+ count
+-------
+ 0
+(1 row)
+
+SELECT count(*)
+FROM pg_database d
+CROSS JOIN pg_stats_vacuum_database(0)
+WHERE oid = 0; -- must be 0
+ count
+-------
+ 0
+(1 row)
+
+\c postgres
+DROP DATABASE statistic_vacuum_database1;
+DROP DATABASE statistic_vacuum_database;
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index 969ced994f..23b0cad1cb 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -136,3 +136,9 @@ test: fast_default
# run tablespace test at the end because it drops the tablespace created during
# setup that other tests may use.
test: tablespace
+
+# ----------
+# Check vacuum statistics
+# ----------
+test: vacuum_index_statistics
+test: vacuum_tables_and_db_statistics
\ No newline at end of file
diff --git a/src/test/regress/sql/vacuum_index_statistics.sql b/src/test/regress/sql/vacuum_index_statistics.sql
new file mode 100644
index 0000000000..2ccbf53346
--- /dev/null
+++ b/src/test/regress/sql/vacuum_index_statistics.sql
@@ -0,0 +1,158 @@
+--
+-- Test cumulative vacuum stats system
+--
+-- Check the wall statistics collected during vacuum operation:
+-- number of frozen and visible pages set by vacuum;
+-- number of frozen and visible pages removed by backend.
+-- Statistic wal_fpi is not displayed in this test because its behavior is unstable.
+--
+-- conditio sine qua non
+SHOW track_counts; -- must be on
+-- not enabled by default, but we want to test it...
+SET track_functions TO 'all';
+
+
+-- ensure pending stats are flushed
+SELECT pg_stat_force_next_flush();
+
+\set sample_size 10000
+SET vacuum_freeze_min_age = 0;
+SET vacuum_freeze_table_age = 0;
+--SET stats_fetch_consistency = snapshot;
+CREATE TABLE vestat (x int primary key) WITH (autovacuum_enabled = off, fillfactor = 10);
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+ANALYZE vestat;
+
+SELECT oid AS ioid from pg_class where relname = 'vestat_pkey' \gset
+
+DELETE FROM vestat WHERE x % 2 = 0;
+-- Before the first vacuum execution extended stats view is empty.
+SELECT vt.relname,relpages,pages_deleted,tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+SELECT relpages AS irp
+FROM pg_class c
+WHERE relname = 'vestat_pkey' \gset
+
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP ON) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+
+-- The table and index extended vacuum statistics should show us that
+-- vacuum frozed pages and clean up pages, but pages_removed stayed the same
+-- because of not full table have cleaned up
+SELECT vt.relname,relpages-:irp = 0 AS relpages,pages_deleted = 0 AS pages_deleted,tuples_deleted > 0 AS tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+SELECT vt.relname,relpages AS irp,pages_deleted AS ipd,tuples_deleted AS itd
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid \gset
+
+-- Store WAL advances into variables
+SELECT wal_records AS iwr,wal_bytes AS iwb,wal_fpi AS ifpi FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+
+-- Look into WAL records deltas.
+SELECT wal_records > 0 AS diWR, wal_bytes > 0 AS diWB
+FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey';
+
+DELETE FROM vestat;;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP ON) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+
+-- pages_removed must be increased
+SELECT vt.relname,relpages-:irp = 0 AS relpages,pages_deleted-:ipd > 0 AS pages_deleted,tuples_deleted-:itd > 0 AS tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+SELECT vt.relname,relpages AS irp,pages_deleted AS ipd,tuples_deleted AS itd
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid \gset
+
+-- Store WAL advances into variables
+SELECT wal_records-:iwr AS diwr, wal_bytes-:iwb AS diwb, wal_fpi-:ifpi AS difpi
+FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+
+-- WAL advance should be detected.
+SELECT :diwr > 0 AS diWR, :diwb > 0 AS diWB;
+
+-- Store WAL advances into variables
+SELECT wal_records AS iwr,wal_bytes AS iwb,wal_fpi AS ifpi FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+DELETE FROM vestat WHERE x % 2 = 0;
+-- VACUUM FULL doesn't report to stat collector. So, no any advancements of statistics
+-- are detected here.
+VACUUM FULL vestat;
+-- It is necessary to check the wal statistics
+CHECKPOINT;
+
+-- Store WAL advances into variables
+SELECT wal_records-:iwr AS diwr2, wal_bytes-:iwb AS diwb2, wal_fpi-:ifpi AS difpi2
+FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+
+-- WAL and other statistics advance should not be detected.
+SELECT :diwr2=0 AS diWR, :difpi2=0 AS iFPI, :diwb2=0 AS diWB;
+
+SELECT vt.relname,relpages-:irp < 0 AS relpages,pages_deleted-:ipd = 0 AS pages_deleted,tuples_deleted-:itd = 0 AS tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+SELECT vt.relname,relpages AS irp,pages_deleted AS ipd,tuples_deleted AS itd
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid \gset
+
+-- Store WAL advances into variables
+SELECT wal_records AS iwr,wal_bytes AS iwb,wal_fpi AS ifpi FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+
+DELETE FROM vestat;
+TRUNCATE vestat;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP ON) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+
+-- Store WAL advances into variables after removing all tuples from the table
+SELECT wal_records-:iwr AS diwr3, wal_bytes-:iwb AS diwb3, wal_fpi-:ifpi AS difpi3
+FROM pg_stats_vacuum_indexes WHERE relname = 'vestat_pkey' \gset
+
+--There are nothing changed
+SELECT :diwr3=0 AS diWR, :difpi3=0 AS iFPI, :diwb3=0 AS diWB;
+
+--
+-- Now, the table and index is compressed into zero number of pages. Check it
+-- in vacuum extended statistics.
+-- The pages_frozen, pages_scanned values shouldn't be changed
+--
+SELECT vt.relname,relpages-:irp = 0 AS relpages,pages_deleted-:ipd = 0 AS pages_deleted,tuples_deleted-:itd = 0 AS tuples_deleted
+FROM pg_stats_vacuum_indexes vt, pg_class c
+WHERE vt.relname = 'vestat_pkey' AND vt.relid = c.oid;
+
+-- ensure pending stats are flushed
+SELECT pg_stat_force_next_flush();
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+ANALYZE vestat;
+
+-- must be empty
+SELECT pages_frozen, pages_all_visible, rev_all_frozen_pages,rev_all_visible_pages
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) vestat;
+
+-- vacuum should freezed pages, but there is nothing to defreeze
+SELECT pages_frozen > 0 AS pages_frozen,pages_all_visible > 0 AS pages_all_visible,rev_all_frozen_pages = 0 AS rev_all_frozen_pages,rev_all_visible_pages = 0 AS rev_all_visible_pages
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+SELECT pages_frozen AS pf, pages_all_visible AS pv, rev_all_frozen_pages AS hafp,rev_all_visible_pages AS havp
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+
+UPDATE vestat SET x = x+1001;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) vestat;
+
+SELECT pages_frozen > :pf AS pages_frozen,pages_all_visible > :pv AS pages_all_visible,rev_all_frozen_pages > :hafp AS rev_all_frozen_pages,rev_all_visible_pages > :havp AS rev_all_visible_pages
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+SELECT pages_frozen AS pf, pages_all_visible AS pv, rev_all_frozen_pages AS hafp,rev_all_visible_pages AS havp
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) vestat;
+
+SELECT pages_frozen = :pf AS pages_frozen,pages_all_visible = :pv AS pages_all_visible,rev_all_frozen_pages = :hafp AS rev_all_frozen_pages,rev_all_visible_pages = :havp AS rev_all_visible_pages
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+
+DROP TABLE vestat;
\ No newline at end of file
diff --git a/src/test/regress/sql/vacuum_tables_and_db_statistics.sql b/src/test/regress/sql/vacuum_tables_and_db_statistics.sql
new file mode 100644
index 0000000000..f3914a6531
--- /dev/null
+++ b/src/test/regress/sql/vacuum_tables_and_db_statistics.sql
@@ -0,0 +1,192 @@
+--
+-- Test cumulative vacuum stats system
+--
+-- Check the wall statistics collected during vacuum operation:
+-- number of frozen and visible pages set by vacuum;
+-- number of frozen and visible pages removed by backend.
+-- Statistic wal_fpi is not displayed in this test because its behavior is unstable.
+--
+
+CREATE DATABASE statistic_vacuum_database;
+CREATE DATABASE statistic_vacuum_database1;
+\c statistic_vacuum_database;
+-- conditio sine qua non
+SHOW track_counts; -- must be on
+-- not enabled by default, but we want to test it...
+SET track_functions TO 'all';
+
+
+-- ensure pending stats are flushed
+SELECT pg_stat_force_next_flush();
+
+\set sample_size 10000
+SET vacuum_freeze_min_age = 0;
+SET vacuum_freeze_table_age = 0;
+--SET stats_fetch_consistency = snapshot;
+CREATE TABLE vestat (x int) WITH (autovacuum_enabled = off, fillfactor = 10);
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+ANALYZE vestat;
+
+SELECT oid AS roid from pg_class where relname = 'vestat' \gset
+
+DELETE FROM vestat WHERE x % 2 = 0;
+-- Before the first vacuum execution extended stats view is empty.
+SELECT vt.relname,pages_frozen,tuples_deleted,relpages,pages_scanned,pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+SELECT relpages AS rp
+FROM pg_class c
+WHERE relname = 'vestat' \gset
+
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP OFF) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+
+-- The table and index extended vacuum statistics should show us that
+-- vacuum frozed pages and clean up pages, but pages_removed stayed the same
+-- because of not full table have cleaned up
+SELECT vt.relname,pages_frozen > 0 AS pages_frozen,tuples_deleted > 0 AS tuples_deleted,relpages-:rp = 0 AS relpages,pages_scanned > 0 AS pages_scanned,pages_removed = 0 AS pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+SELECT pages_frozen AS fp,tuples_deleted AS td,relpages AS rp, pages_scanned AS ps, pages_removed AS pr
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid \gset
+
+-- Store WAL advances into variables
+SELECT wal_records AS hwr,wal_bytes AS hwb,wal_fpi AS hfpi FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+
+-- Look into WAL records deltas.
+SELECT wal_records > 0 AS dWR, wal_bytes > 0 AS dWB
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat';
+
+DELETE FROM vestat;;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP OFF) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+
+-- pages_removed must be increased
+SELECT vt.relname,pages_frozen-:fp > 0 AS pages_frozen,tuples_deleted-:td > 0 AS tuples_deleted,relpages -:rp = 0 AS relpages,pages_scanned-:ps > 0 AS pages_scanned,pages_removed-:pr > 0 AS pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+SELECT pages_frozen AS fp,tuples_deleted AS td,relpages AS rp, pages_scanned AS ps, pages_removed AS pr
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid \gset
+
+-- Store WAL advances into variables
+SELECT wal_records-:hwr AS dwr, wal_bytes-:hwb AS dwb, wal_fpi-:hfpi AS dfpi
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+
+-- WAL advance should be detected.
+SELECT :dwr > 0 AS dWR, :dwb > 0 AS dWB;
+
+-- Store WAL advances into variables
+SELECT wal_records AS hwr,wal_bytes AS hwb,wal_fpi AS hfpi FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+DELETE FROM vestat WHERE x % 2 = 0;
+-- VACUUM FULL doesn't report to stat collector. So, no any advancements of statistics
+-- are detected here.
+VACUUM FULL vestat;
+-- It is necessary to check the wal statistics
+CHECKPOINT;
+
+-- Store WAL advances into variables
+SELECT wal_records-:hwr AS dwr2, wal_bytes-:hwb AS dwb2, wal_fpi-:hfpi AS dfpi2
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+
+-- WAL and other statistics advance should not be detected.
+SELECT :dwr2=0 AS dWR, :dfpi2=0 AS dFPI, :dwb2=0 AS dWB;
+
+SELECT vt.relname,pages_frozen-:fp = 0 AS pages_frozen,tuples_deleted-:td = 0 AS tuples_deleted,relpages -:rp < 0 AS relpages,pages_scanned-:ps = 0 AS pages_scanned,pages_removed-:pr = 0 AS pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+SELECT pages_frozen AS fp,tuples_deleted AS td,relpages AS rp, pages_scanned AS ps,pages_removed AS pr
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid \gset
+
+-- Store WAL advances into variables
+SELECT wal_records AS hwr,wal_bytes AS hwb,wal_fpi AS hfpi FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+
+DELETE FROM vestat;
+TRUNCATE vestat;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128, INDEX_CLEANUP OFF) vestat;
+-- it is necessary to check the wal statistics
+CHECKPOINT;
+
+-- Store WAL advances into variables after removing all tuples from the table
+SELECT wal_records-:hwr AS dwr3, wal_bytes-:hwb AS dwb3, wal_fpi-:hfpi AS dfpi3
+FROM pg_stats_vacuum_tables WHERE relname = 'vestat' \gset
+
+--There are nothing changed
+SELECT :dwr3>0 AS dWR, :dfpi3=0 AS dFPI, :dwb3>0 AS dWB;
+
+--
+-- Now, the table and index is compressed into zero number of pages. Check it
+-- in vacuum extended statistics.
+-- The pages_frozen, pages_scanned values shouldn't be changed
+--
+SELECT vt.relname,pages_frozen-:fp = 0 AS pages_frozen,tuples_deleted-:td = 0 AS tuples_deleted,relpages -:rp = 0 AS relpages,pages_scanned-:ps = 0 AS pages_scanned,pages_removed-:pr = 0 AS pages_removed
+FROM pg_stats_vacuum_tables vt, pg_class c
+WHERE vt.relname = 'vestat' AND vt.relid = c.oid;
+
+-- Now check vacuum statistics for current database
+SELECT pg_database.datname,
+ db_blks_hit > 0 AS db_blks_hit,
+ total_blks_dirtied > 0 AS total_blks_dirtied,
+ total_blks_written > 0 AS total_blks_written,
+ wal_records > 0 AS wal_records,
+ wal_fpi > 0 AS wal_fpi,
+ wal_bytes > 0 AS wal_bytes,
+ user_time > 0 AS user_time,
+ total_time > 0 AS total_time
+FROM
+pg_stats_vacuum_database, pg_database
+WHERE pg_database.datname = current_database() and pg_database.oid = pg_stats_vacuum_database.dboid;
+
+DROP TABLE vestat CASCADE;
+
+-- ensure pending stats are flushed
+SELECT pg_stat_force_next_flush();
+
+CREATE TABLE vestat (x int) WITH (autovacuum_enabled = off, fillfactor = 10);
+INSERT INTO vestat SELECT x FROM generate_series(1,:sample_size) as x;
+ANALYZE vestat;
+UPDATE vestat SET x = x+10001;
+VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) vestat;
+
+\c statistic_vacuum_database1;
+
+-- Now check vacuum statistics for postgres database from another database
+SELECT pg_database.datname,
+ db_blks_hit > 0 AS db_blks_hit,
+ total_blks_dirtied > 0 AS total_blks_dirtied,
+ total_blks_written > 0 AS total_blks_written,
+ wal_records > 0 AS wal_records,
+ wal_fpi > 0 AS wal_fpi,
+ wal_bytes > 0 AS wal_bytes,
+ user_time > 0 AS user_time,
+ total_time > 0 AS total_time
+FROM
+pg_stats_vacuum_database, pg_database
+WHERE pg_database.datname = 'statistic_vacuum_database' and pg_database.oid = pg_stats_vacuum_database.dboid;
+
+\c statistic_vacuum_database
+
+RESET vacuum_freeze_min_age;
+RESET vacuum_freeze_table_age;
+DROP TABLE vestat CASCADE;
+
+\c statistic_vacuum_database1;
+SELECT count(*)
+FROM pg_database d
+CROSS JOIN pg_stats_vacuum_tables(d.oid, 0)
+WHERE oid = 0; -- must be 0
+
+SELECT count(*)
+FROM pg_database d
+CROSS JOIN pg_stats_vacuum_database(0)
+WHERE oid = 0; -- must be 0
+
+\c postgres
+DROP DATABASE statistic_vacuum_database1;
+DROP DATABASE statistic_vacuum_database;
\ No newline at end of file