1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-18 04:29:09 +03:00

Avoid having vacuum set reltuples to 0 on non-empty relations in the

presence of page pins, which leads to serious estimation errors in the
planner.  This particularly affects small heavily-accessed tables,
especially where locking (e.g. from FK constraints) forces frequent
vacuums for mxid cleanup.

Fix by keeping separate track of pages whose live tuples were actually
counted vs. pages that were only scanned for freezing purposes.  Thus,
reltuples can only be set to 0 if all pages of the relation were
actually counted.

Backpatch to all supported versions.

Per bug #14057 from Nicolas Baccelli, analyzed by me.

Discussion: https://postgr.es/m/20160331103739.8956.94469@wrigleys.postgresql.org
This commit is contained in:
Andrew Gierth
2017-03-16 22:28:03 +00:00
parent 80824ddda3
commit 1914c5ea7d
4 changed files with 119 additions and 4 deletions

View File

@@ -0,0 +1,45 @@
# Test for vacuum's handling of reltuples when pages are skipped due
# to page pins. We absolutely need to avoid setting reltuples=0 in
# such cases, since that interferes badly with planning.
setup {
create table smalltbl
as select i as id from generate_series(1,20) i;
alter table smalltbl set (autovacuum_enabled = off);
}
setup {
vacuum analyze smalltbl;
}
teardown {
drop table smalltbl;
}
session "worker"
step "open" {
begin;
declare c1 cursor for select * from smalltbl;
}
step "fetch1" {
fetch next from c1;
}
step "close" {
commit;
}
step "stats" {
select relpages, reltuples from pg_class
where oid='smalltbl'::regclass;
}
session "vacuumer"
step "vac" {
vacuum smalltbl;
}
step "modify" {
insert into smalltbl select max(id)+1 from smalltbl;
delete from smalltbl where id in (select min(id) from smalltbl);
}
permutation "modify" "vac" "stats"
permutation "modify" "open" "fetch1" "vac" "close" "stats"
permutation "modify" "vac" "stats"