Перейти к основному содержимому

Автоочистка

  1. Включите автоочистку для таблицы fatab.

    postgres@monman_db=# ALTER TABLE fatab SET (autovacuum_enabled = on);
    ALTER TABLE
  2. Повторите UPDATE таблицы fatab с проверкой ее размера.

    postgres@monman_db=# UPDATE fatab SET dte = dte - 1 WHERE id % 2 = 0 \; SELECT pg_size_pretty(pg_total_relation_size('fatab'));
    Разбор команды

    • UPDATE fatab SET dte = dte - 1 WHERE id % 2 = 0 — изменение дат у строк с четными id;
    • \; — метакоманда psql, разделяющая несколько SQL-команд в одной строке ввода;
    • SELECT pg_size_pretty(pg_total_relation_size('fatab')) — получение суммарного размера таблицы после обновления.
    UPDATE 50000
    pg_size_pretty
    ----------------
    9744 kB
    (1 row)

    Размер таблицы увеличился с 5752 КБ до 9744 КБ из-за создания новых версий строк.

  3. Проверьте наличие выполненных команд в буфере psql.

    postgres@monman_db=# \p
    UPDATE fatab SET dte = dte - 1 WHERE id % 2 = 0 ; SELECT pg_size_pretty(pg_total_relation_size('fatab'));
  4. Запустите циклическое повторение команд из буфера через 10 секунд, используя \watch 10. Остановите выполнение нажатием Ctrl+C тогда, когда размер таблицы стабилизируется и не будет больше увеличиваться.

    postgres@monman_db=# \watch 10
    UPDATE 50000
    Sun 10 Nov 2024 10:04:40 PM MSK (every 10s)
    pg_size_pretty
    ----------------
    9752 kB
    (1 row)
    ...
    UPDATE 50000
    Sun 10 Nov 2024 10:07:20 PM MSK (every 10s)
    pg_size_pretty
    ----------------
    18 MB
    (1 row)
    UPDATE 50000
    Sun 10 Nov 2024 10:07:30 PM MSK (every 10s)
    pg_size_pretty
    ----------------
    18 MB
    (1 row)

    Размер таблицы вырос с 9752 КБ до 18 МБ, а затем стабилизировался. Автоочистка сработала и освободила место на страницах для повторного использования, предотвратив дальнейший рост.

Самопроверка​

Вопрос 1

В сеансе psql выполнены команды:

postgres@monman_db=# ALTER TABLE fatab SET (autovacuum_enabled = on);
ALTER TABLE

postgres@monman_db=# UPDATE fatab SET dte = dte - 1 WHERE id % 2 = 0 \; SELECT pg_size_pretty(pg_total_relation_size('fatab'));
UPDATE 50000
 pg_size_pretty
----------------
 9744 kB
(1 row)

Размер таблицы вырос с 5752 КБ до 9744 КБ. Почему сразу после UPDATE размер увеличился?

Вопрос 2

В сеансе psql выполнена команда:

postgres@monman_db=# \watch 10
UPDATE 50000
Sun 10 Nov 2024 10:04:40 PM MSK (every 10s)
 pg_size_pretty
----------------
 9752 kB
(1 row)
...
UPDATE 50000
Sun 10 Nov 2024 10:07:20 PM MSK (every 10s)
 pg_size_pretty
----------------
 18 MB
(1 row)
UPDATE 50000
Sun 10 Nov 2024 10:07:30 PM MSK (every 10s)
 pg_size_pretty
----------------
 18 MB
(1 row)

Почему размер стабилизировался на уровне 18 МБ?