Re: Relstats after VACUUM FULL and CLUSTER

Поиск
Список
Период
Сортировка
От Sami Imseih
Тема Re: Relstats after VACUUM FULL and CLUSTER
Дата
Msg-id CAA5RZ0tsuTJxKzC+-mYFZxUwyxLjW8k2QG3pZ=xn27Hy0PY8xA@mail.gmail.com
обсуждение исходный текст
Ответ на Relstats after VACUUM FULL and CLUSTER  (Erik Nordström <erik@timescale.com>)
Ответы Re: Relstats after VACUUM FULL and CLUSTER
Список pgsql-hackers
> Does this seem like a bug or is it intentional?

pg_class.reltuples/relpages are only an estimate as per documentation.

However, I cannot reproduce the situation you are talking about on HEAD.
In the below example, I create a table without indexes, then insert and
delete some rows. run vacuum to update the pg_class.reltuples, then run
another delete to generate some more "recent" dead tuples.

The result shows pg_class.reltuples with the expected value,
but maybe I did not repro the same way you did?

( I am surprised that n_live_tup, n_dead_tup is off and also that
VACUUM FULL does not appear to update the stats in pg_stat_all_tables)

```
postgres=# drop table if exists t;
create table t ( id int );
alter table t set (autovacuum_enabled = off);
insert into t select n from generate_series(1, 1000000) as n;
delete from t where id between 1 and 5000;
vacuum t;
delete from t where id between 5001 and 10000;
select reltuples::int from pg_class where relname = 't';
-- might take a bit of time for n_dead_tup to be set
select n_dead_tup, n_live_tup from pg_stat_all_tables where relname = 't';
DROP TABLE
CREATE TABLE
ALTER TABLE
INSERT 0 1000000
DELETE 5000
VACUUM
DELETE 5000
 reltuples
-----------
    995000
(1 row)

 n_dead_tup | n_live_tup
------------+------------
      10000 |     985000
(1 row)

postgres=# VACUUM (verbose, full) t;
INFO:  vacuuming "public.t"
INFO:  "public.t": found 5000 removable, 990000 nonremovable row
versions in 4425 pages
DETAIL:  0 dead row versions cannot be removed yet.
CPU: user: 0.79 s, system: 0.02 s, elapsed: 0.86 s.
VACUUM

select reltuples::int from pg_class where relname = 't';
select n_dead_tup from pg_stat_all_tables where relname = 't';

postgres=# select reltuples::int from pg_class where relname = 't';
select n_dead_tup, n_live_tup from pg_stat_all_tables where relname = 't';
 reltuples
-----------
    990000
(1 row)

postgres=# select n_dead_tup, n_live_tup from pg_stat_all_tables where
relname = 't';
 n_dead_tup | n_live_tup
------------+------------
      10000 |     985000
(1 row)

--
Sami Imseih
Amazon Web Services (AWS)



В списке pgsql-hackers по дате отправления: