PostgreSQL - Большой текст в строках - Обновление или Вставка и удаление - Что лучше для восстановления пространства / повышения производительности - PullRequest
1 голос
/ 20 ноября 2011

У меня есть postgres db как часть приложения, в котором в настоящее время есть текстовые поля, заполненные примерно 300 КБ текста.

В таблице есть около 3 столбцов, которые обычно можно заполнить таким количеством информации.,Это приводит к тому, что таблицы превышают приблизительно 100 строк.Я хотел бы удалить данные из этих столбцов, не удаляя остальную информацию в строке - мой вопрос заключается в том, что если я обновлю набор столбцов = '', это лучше, чем при вставке в выбор, где я просто выбираюстроки, которые мне нужны, а затем удалить существующую строку.Это стороннее приложение, поэтому переписать способ хранения данных на данный момент невозможно.

Ответы [ 2 ]

5 голосов
/ 20 ноября 2011

Прежде всего, с 3 столбцами текста размером ~ 300 Кб размер таблицы не должен превышать 1 ГБ, а всего 100 строк. У вас включен автовакуум? Или вы регулярно запускаете вакуум? Читайте о вакууме в руководстве . Проверьте свои настройки .

Что касается вопроса ОБНОВЛЕНИЕ против ВСТАВКИ / УДАЛЕНИЯ: из-за модели MVCC PostgreSQL каждое ОБНОВЛЕНИЕ фактически является новой ВСТАВКОЙ. Старый ряд будет сохранен и в конечном итоге очищен вакуумом. Используйте ОБНОВЛЕНИЕ , это проще. Ключ к восстановлению пространства / производительности - вакуумирование .

Существует также связанная команда CLUSTER . Переписывает всю таблицу и все индексы в идеальном состоянии. Ударяет VACUUM FULL, потому что это фактически также REINDEX. Вы можете попробовать это один раз, чтобы увидеть реальный размер таблицы без мертвых кортежей.

Относительно производительности: PostgreSQL записывает (сжатое) содержимое больших столбцов в таблицы TOAST . Таким образом, стандартные запросы выполняют одно и то же, независимо от размера столбца 30 КБ или 30 МБ. Это влияет только на время получения найденных строк.

Поскольку данные вне линии (TOASTed) также сжимаются, ваша таблица не должна превышать 1 ГБ (включая таблицу TOAST), даже если представление на диске в базе данных обычно занимает в 2-3 раза больше места сырые данные. Обычно это означает, что вы не пылесосите, и на вашем столе много мертвых кортежей.

Одним из побочных эффектов таблиц TOAST является то, что UPDATE может работать лучше , чем INSERT / DELETE. Потому что:

Во время операции ОБНОВЛЕНИЯ значения неизмененных полей обычно сохраняется как есть; поэтому происходит ОБНОВЛЕНИЕ строки со значениями вне строки нет затрат на ТОСТ, если не изменяется ни одно из внеплановых значений.

Тем не менее, в вашем случае это не имеет значения, поскольку ваш план состоит в том, чтобы все равно обнулять большие столбцы.

0 голосов
/ 20 ноября 2011

В любом случае должно работать.ОБНОВЛЕНИЕ проще, так что продолжайте.

Единственное преимущество, которое я могу думать о том, что ВСТАВЛЕНИЕ в ту же / новую таблицу - это снижение конкуренции (потому что вы будете писать в новую таблицу или, по крайней мере, в отдельную строку).).Но это, вероятно, спорный вопрос с таблицей всего лишь 100 строк (даже если они очень широкие строки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...