vacuum_file.diff.no-cfbot

text/plain

Filename: vacuum_file.diff.no-cfbot
Type: text/plain
Part: 1
Message: Re: Vacuum statistics
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