Поддерживает ли PostgreSQL прозрачное сжатие таблиц (фрагментов)?
Я собираюсь хранить большое количество данных (журналов) в фрагментированных таблицах PostgreSQL (таблица в день). Я хотел бы сжать некоторые из них, чтобы сэкономить место на моих дисках, но я не хочу терять возможность запрашивать их обычным способом.
Поддерживает ли PostgreSQL такое прозрачное сжатие и где я могу прочитать об этом более подробно? Я думаю, что должно быть какое-то известное волшебное имя для такой функции.
3 ответа
Да, PostgreSQL сделает это автоматически для вас, когда они превысят определенный размер. Сжатие применяется при каждом отдельном значении данных, но не на уровне полной таблицы. Это означает, что если у вас миллиард строк, которые очень узкие, они не будут сжаты. Или, если у вас очень много столбцов, каждый из которых содержит только небольшое значение, они не будут сжаты. Подробности об этой схеме в руководстве.
Если вам это нужно на уровне полной таблицы, решение состоит в том, чтобы создать TABLESPACE для тех таблиц, которые вы хотите сжать, и указать его для сжатой файловой системы. Пока файловая система все еще подчиняется fsync() и стандартной семантике POSIX, это должно быть совершенно безопасно. Подробности об этом в руководстве.
Вероятно, не то, что вы имеете в виду, но все же полезная информация - Глава 53. Физическое хранение базы данных прекрасного руководства. Раздел TOAST заслуживает дальнейшего внимания.
Также не совсем то, что вы просили, но может быть полезно для больших наборов данных, это то, что PostgreSQL поддерживает наследование таблиц, позволяя вам разбивать ваши данные, например, по диапазонам дат. Или какая-то другая логика.