Подтвердить что ты не робот

Существуют ли проблемы с производительностью при хранении файлов в PostgreSQL?

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

И что лучше использовать, сохраните как BLOB (он хранится в файле, правильно?) или в столбце с типом bytea?

4b9b3361

Ответ 1

У вас есть в основном два варианта. Вы можете сохранить данные прямо в строке или использовать объект большого объекта. Поскольку PostgreSQL теперь использует что-то под названием TOAST для перемещения больших полей из таблицы, не должно быть штрафа за производительность, связанного с хранением больших данных в строке напрямую. Остается ограничение 1 ГБ в размере поля. Если это слишком ограничено или вам нужен потоковый API, вы можете использовать объект большого объекта, который дает вам нечто большее, чем файловые дескрипторы в базе данных. Вы сохраняете идентификатор LO в своем столбце и можете читать и писать с этого идентификатора.

Я лично предлагаю вам избегать объекта большого объекта, если он вам не нужен. С помощью TOAST большинство случаев использования покрываются за счет использования базы данных так, как вы ожидали. С большими объектами вы предоставляете себе дополнительную нагрузку на обслуживание, потому что вам нужно отслеживать используемые вами идентификаторы LO и обязательно отключайте их, когда они больше не используются (но не раньше), или они будут сидеть в вашем каталог данных занимает пространство навсегда. Есть также множество объектов, которые имеют исключительное поведение вокруг них, детали из которых убегают от меня, потому что я никогда не использую их.

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

Ответ 2

Тип BLOB (LO) хранит данные в блоках 2KB в стандартных страницах кучи PostgreSQL, размер которых по умолчанию составляет 8 КБ. Они не хранятся как независимые, сплоченные файлы в файловой системе - например, вы не сможете найти файл, выполнить побайтовое сравнение и ожидать, что он будет таким же, как исходные данные файла, которые вы загружается в базу данных, так как там также заголовки и структуры заголовков Postgres, которые очерчивают куски.

Вам следует избегать использования интерфейса Large Object (LO), если вашему приложению потребуется часто обновлять двоичные данные, и особенно если это связано с множеством небольших записей с произвольным доступом, которые из-за того, что PostgreSQL реализует concurrency control (MVCC) может привести к взрыву в объеме дискового пространства, используемого до тех пор, пока вы не получите базу данных VACUUM. Тот же результат, вероятно, также применим к данным, хранящимся inline в столбце с типом bytea или даже TOAST'd.

Однако, если ваши данные следуют шаблону Write-Once-Read-Many (например, загружают изображение PNG и не изменяют его впоследствии), это должно быть хорошо с точки зрения использования диска.

См. этот поток рассылки pgsql-general для дальнейшего обсуждения.