Почему 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 запускается автоматический вакуум. Но в моем случае оба не обновляются правильно и, следовательно, автоматический вакуум не работает. Я потерян здесь. Пожалуйста, кто-нибудь направит меня.

Почему эти статистические данные не обновляются правильно? Я делаю что-то не так?

0 ответов

Другие вопросы по тегам