Почему n_dead_tup в pg_stat_user_tables и relTuples в pg_class(в postgresql) не обновляются правильно? Из-за этого автовакуум не работает
Почему n_dead_tup в pg_stat_user_tables и relTuples в pg_class (в postgresql) не обновляются правильно? Из-за этого автовакуум не работает
Конфигурация Postgres
UserDB=# SELECT name, setting FROM pg_settings WHERE name = 'autovacuum_vacuum_threshold';
name | setting
-----------------------------+---------
autovacuum_vacuum_threshold | 50
(1 row)
UserDB=# SELECT name, setting FROM pg_settings WHERE name = 'autovacuum_vacuum_scale_factor'; //query
name | setting
--------------------------------+---------
autovacuum_vacuum_scale_factor | 0.2
(1 row)
UserDB=# SELECT name, setting FROM pg_settings WHERE name = 'autovacuum';
name | setting
------------+---------
autovacuum | on
(1 row)
UserDB=# SELECT name, setting FROM pg_settings WHERE name = 'track_counts'; //query
name | setting
--------------+---------
track_counts | on
(1 row)
Запуск процесса Postgres
2122 2070 postgres S 96244 11% 0% {postmaster} postgres: userDB
4698 2070 postgres S 95904 11% 0% {postmaster} postgres: postgres postg
2098 2070 postgres S 94064 10% 0% {postmaster} postgres: autovacuum launcher
2070 1 postgres S 93644 10% 0% /usr/bin/postmaster -D /usr/local/pgsql
2095 2070 postgres S 93644 10% 0% {postmaster} postgres: checkpointer pr
2096 2070 postgres S 93644 10% 0% {postmaster} postgres: writer process
2097 2070 postgres S 93644 10% 0% {postmaster} postgres: wal writer proc
Шаг 1
Первоначально размер БД составляет 16001244 (выберите * из pg_database_size('user');) таблица количества строк равна 2025 (выберите количество (*) из Ticket;)
UserDB=# select reltuples,relPages from pg_class where relname = 'Ticket';
reltuples | relpages
-----------+----------
0 | 0
(1 row)
UserDB=# select relname,n_tup_upd,n_tup_del,n_tup_hot_upd, n_live_tup,n_dead_tup,last_vacuum, last_autovacuum, last_analyze, last_autoanalyze from pg_stat_user_tables where relname = 'Ticket'; //query
relname | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | last_vacuum | last_autovacuum | last_analyze | last_autoanalyze
---------+-----------+-----------+---------------+------------+------------+-------------+-------------------------------+---------------------------+------------------
Ticket | 0 | 0 | 0 | 0 | 0 | | | |
(1 row)
Шаг 2
Удалил почти 100 строк из моей таблицы. Теперь размер БД составляет 16001244 (выберите * из pg_database_size('user');) таблица количества строк равна 1925 (выберите количество (*) из Ticket;)
UserDB=# select reltuples,relPages from pg_class where relname = 'Ticket'; //query
reltuples | relpages
-----------+----------
0 | 0
(1 row)
UserDB=# select relname,n_tup_upd,n_tup_del,n_tup_hot_upd, n_live_tup,n_dead_tup,last_vacuum, last_autovacuum, last_analyze, last_autoanalyze from pg_stat_user_tables where relname = 'Ticket'; //query
relname | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | last_vacuum | last_autovacuum | last_analyze | last_autoanalyze
---------+-----------+-----------+---------------+------------+------------+-------------+-------------------------------+---------------------------+------------------
Ticket | 0 | 0 | 0 | 0 | 0 | | | |
(1 row)
Шаг 3
UserDB=# ANALYZE Ticket;
Теперь размер БД составляет 16009436 (выберите * из pg_database_size('user');) таблица количества строк равна 1925 (выберите количество (*) из Ticket;)
UserDB=# select reltuples,relPages from pg_class where relname = 'Ticket'; //query
reltuples | relpages
-----------+----------
1925 | 1013
(1 row)
UserDB=# select relname,n_tup_upd,n_tup_del,n_tup_hot_upd, n_live_tup,n_dead_tup,last_vacuum, last_autovacuum, last_analyze, last_autoanalyze from pg_stat_user_tables where relname = 'Ticket'; //query
relname | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | last_vacuum | last_autovacuum | last_analyze | last_autoanalyze
---------+-----------+-----------+---------------+------------+------------+-------------+-------------------------------+---------------------------+------------------
Ticket | 0 | 0 | 0 | 1925 | 100 | | | 2017-11-27 00:21:46.542566+01 |
(1 row)
Шаг: 4
Удалил 10 строк из моей таблицы. Теперь размер БД составляет 16009436 (выберите * из pg_database_size('user');) таблица количества строк равна 1915 (выберите количество (*) из Ticket;)
UserDB=# select reltuples,relPages from pg_class where relname = 'Ticket'; //query
reltuples | relpages
-----------+----------
1925 | 1013
(1 row)
UserDB=# select relname,n_tup_upd,n_tup_del,n_tup_hot_upd, n_live_tup,n_dead_tup,last_vacuum, last_autovacuum, last_analyze, last_autoanalyze from pg_stat_user_tables where relname = 'Ticket'; //query
relname | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | last_vacuum | last_autovacuum | last_analyze | last_autoanalyze
---------+-----------+-----------+---------------+------------+------------+-------------+-------------------------------+---------------------------+------------------
Ticket | 0 | 0 | 0 | 1925 | 0 | | 2017-11-27 00:25:46.542566+01 | 2017-11-27 00:21:46.542566+01 |
(1 row)
шаг: 5
Удалил 500 строк из моей таблицы. Теперь размер БД 16009436 (выберите * из pg_database_size('user');) таблица количества строк равна 1715 (выберите количество (*) из Ticket;)
UserDB=# select reltuples,relPages from pg_class where relname = 'Ticket'; //query
reltuples | relpages
-----------+----------
1925 | 1013
(1 row)
UserDB=# select relname,n_tup_upd,n_tup_del,n_tup_hot_upd, n_live_tup,n_dead_tup,last_vacuum, last_autovacuum, last_analyze, last_autoanalyze from pg_stat_user_tables where relname = 'Ticket'; //query
relname | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | last_vacuum | last_autovacuum | last_analyze | last_autoanalyze
--------+-----------+-----------+---------------+------------+------------+-------------+-------------------------------+---------------------------+------------------
Ticket | 0 | 0 | 0 | 1925 | 0 | | 2017-11-27 00:25:46.542566+01 | 2017-11-27 00:21:46.542566+01 |
(1 row)
Мой вопрос:
Если количество кортежей, устаревших с момента последнего VACUUM, превышает "вакуумный порог", таблица очищается пылесосом. Порог вакуума определяется как: порог вакуума = базовый порог вакуума + масштабный коэффициент вакуума * количество кортежей
на основе мертвых кортежей из сборщика статов и relTuples из pg_class запускается автоматический вакуум. Но в моем случае оба не обновляются правильно и, следовательно, автоматический вакуум не работает. Я потерян здесь. Пожалуйста, кто-нибудь направит меня.
Почему эти статистические данные не обновляются правильно? Я делаю что-то не так?