Одна колонка базы данных AWS добавляет очень много данных - PullRequest
0 голосов
/ 09 ноября 2018

Я получаю данные из базы данных AWS, используя PgAdmin. Это хорошо работает. Проблема в том, что у меня есть один столбец, который я установил в True после получения соответствующей строки, где изначально он установлен в Null. Это добавляет огромный объем данных в мою базу данных.

Я проверил, что это не из-за других процессов: это происходит только тогда, когда моя программа работает. Я уверен, что строки не добавляются, я проверил количество строк до и после, и они одинаковы.

Кроме того, он делает это только при изменении определенных таблиц, когда я обновляю другие таблицы в той же базе данных с тем же процессом, размер базы данных остается тем же. Он также не всегда увеличивает размер базы данных, только при изменении каждой пары общий размер увеличивается.

Как можно изменить одно логическое значение с Null на True, добавить 0,1 МБ в мою базу данных?

Я использую следующие команды для проверки моей базы данных:

Получить размеры таблицы

SELECT
    relname as Table,
    pg_total_relation_size(relid) As Size,
    pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as External Size
FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;

Чтобы получить количество строк:

SELECT schemaname,relname,n_live_tup 
  FROM pg_stat_user_tables 
  ORDER BY n_live_tup DESC;

Чтобы получить размер базы данных:

SELECT pg_database_size('mydatabasename')

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Проблема в том, что ( источник ):

"В обычной работе PostgreSQL кортежи, которые были удалены или обновлены обновлением, физически не удаляются из их таблицы"

Кроме того, мы не всегда закрывали курсор, что также увеличивало размер базы данных во время работы.

Еще одна проблема заключается в том, что мы выполняли один огромный запрос, не позволяющий системе автоматически вакуумироваться. Эта проблема описана более подробно здесь

Наше решение состояло в том, чтобы заново подойти к проблеме, чтобы не нужно было обновлять строки. Другие решения, которые мы могли бы придумать, но не попробовали, - это время от времени останавливать процесс, позволяя автовакууму работать правильно.

0 голосов
/ 17 ноября 2018

Если вы не изменили это, тогда ваш fillfactor находится на уровне 100% в таблице, поскольку это значение по умолчанию.

Это означает, что каждое изменение в вашей таблице помечает измененную строку как устаревшую и воссоздает обновленную строку. Проблема может быть еще хуже, если у вас есть индексы в вашей таблице, так как они должны обновляться при каждом изменении строки. Как вы можете себе представить, это также ухудшает производительность UPDATE.

Технически, если бы вы прочитали всю таблицу и обновили даже самый маленький столбец после чтения строк, то размер таблицы удвоился бы, если ваш fillfactor равен 100.

Что вы можете сделать, это ALTER, чтобы ваш стол опустил на него fillfactor, затем VACUUM it:

ALTER TABLE your_table SET (fillfactor = 90);
VACUUM FULL your_table;

Конечно, с этим шагом ваша таблица будет примерно на 10% больше, но Postgres сэкономит некоторое место для ваших обновлений и не изменит свой размер с вашим процессом.

Причина, по которой автоочистка помогает, заключается в том, что она периодически очищает устаревшие строки и, следовательно, будет поддерживать размер таблицы таким же. Но это оказывает большое давление на вашу базу данных. Если вы знаете, что будете выполнять операции, подобные описанным в вводном вопросе, я бы порекомендовал настроить fillfactor для ваших нужд.

0 голосов
/ 11 ноября 2018

Что вы имеете в виду, добавляет данные? ко всем файлам данных? конкретно для некоторых файлов?

, чтобы получить точный ответ, вы должны предоставить более подробную информацию, но, вообще говоря, любая операция с БД добавит данные в журналы транзакций и, возможно, в другие файлы.

...