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