Автоочистка
-
Включите автоочистку для таблицы
fatab.postgres@monman_db=# ALTER TABLE fatab SET (autovacuum_enabled = on);ALTER TABLE -
Повторите
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 50000pg_size_pretty----------------9744 kB(1 row)Размер таблицы увеличился с 5752 КБ до 9744 КБ из-за создания новых версий строк.
-
Проверьте наличие выполненных команд в буфере
psql.postgres@monman_db=# \pUPDATE fatab SET dte = dte - 1 WHERE id % 2 = 0 ; SELECT pg_size_pretty(pg_total_relation_size('fatab')); -
Запустите циклическое повторение команд из буфера через 10 секунд, используя
\watch 10. Остановите выполнение нажатиемCtrl+Cтогда, когда размер таблицы стабилизируется и не будет больше увеличиваться.postgres@monman_db=# \watch 10UPDATE 50000Sun 10 Nov 2024 10:04:40 PM MSK (every 10s)pg_size_pretty----------------9752 kB(1 row)...UPDATE 50000Sun 10 Nov 2024 10:07:20 PM MSK (every 10s)pg_size_pretty----------------18 MB(1 row)UPDATE 50000Sun 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 МБ?