Стоит ли сжимать строку перед сохранением в PostgresSQL? - PullRequest
0 голосов
/ 11 февраля 2019

Мы храним зашифрованное содержимое файла в базе данных PostgresSQL.Мы храним их много.На данный момент мы не можем записать это содержимое в любом другом месте (например, FTP или внутреннее хранилище).Тем не менее, наша база данных становится все быстрее и быстрее.

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

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


Мой расширенный ответ

Поскольку я хотел узнать больше, я провел несколько экспериментов.

  • Я создал исходный файл с 20000 строк , где 1 строка = 50000случайные символы .
  • Создан файл, в котором 1 строка представляет собой сжатую строку из исходного файла с использованием gzdeflate
  • Я создал таблицу с одним столбцом и вставил каждую строку в виде 1 строки.
  • Сравненные размеры

Вот результаты:

  • исходный файл - ~ 1 ГБ
  • файл с каждой сжатой строкой- 4,45 МБ
  • столбец text STORAGE EXTENDED - размер таблицы 13 МБ
  • столбец text STORAGE EXTERNAL - размер таблицы 1MB + toast 1027MB
  • столбец bytea с предварительно gzdeflated данными - размер таблицы 5.2MB

Я былитийОбращаем ваше внимание на то, что предварительное сжатие и сохранение данных в виде текста с STORAGE EXTENDED возможно, и в результате получилось 700kb размер таблицы НО предварительно сжатые данные содержат символы из большинства палитр кодировки.Извлечение таких данных было бы невозможным.

Вывод:

  • Если вы предпочитаете хранить данные как text, ~ 13 МБ на ~ 1 ГБ контента очень приятноratio.
  • Если вам нужно лучшее сжатие, и вы не против хранить данные как blob / bytea и создавать дополнительные сценарии для управления вставленными / извлеченными данными ... хорошо ... подумайте, стоит ли это несколько МБ.
  • Также помните: по умолчанию PostgreSQL сжимает строки >2kb.Если ваша строка содержит менее ~ 2000 символов, вы должны изменить этот параметр или сжать данные самостоятельно.

1 Ответ

0 голосов
/ 11 февраля 2019

Подробнее см. в документации .

Алгоритм сжатия PostgreSQL быстрый, но не очень хороший, поэтому вы можете сэкономить пространство, сжимая данные перед их сохранением.

Но тогда вы должны изменить таблицу, чтобы использовать стратегию хранения EXTERNAL для столбца.В противном случае PostgreSQL будет без необходимости тратить циклы ЦП, сжимая уже сжатые значения, только чтобы понять, что они не станут меньше, и сохранить их такими, какими они были изначально.

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