31.3. Использование сжатия
Сжатие можно включить для отдельных табличных пространств. При этом системные отношения не сжимаются в любом случае. В настоящее время изменить характеристику сжатия табличного пространства невозможно — то есть нельзя сжать существующее табличное пространство или наоборот, сделать сжатое пространство несжатым.
Поэтому, чтобы использовать сжатие, табличное пространство нужно создать с параметром compression=true
. Вы можете сделать это табличное пространство пространством по умолчанию — в данном случае оно неявно будет назначаться целевым для таблиц, создаваемых в текущем сеансе:
postgres=# create tablespace zfs location '/var/data/cfs' with (compression=true); postgres=# set default_tablespace=zfs;
Для настройки CFS используйте параметры сжатия данных, перечисленные в Разделе 19.14. По умолчанию CFS использует для сборки мусора один рабочий процесс. Сборщик мусора проходит по каталогу табличного пространства, находит в нём файлы отображений и проверяет в них процент мусора. Если отношение неиспользуемого объёма к общему превышает значение cfs_gc_threshold
, этот файл дефрагментируется. На время дефрагментации файл блокируется, в результате чего ни к какой его части нельзя обратиться. По завершении дефрагментации сборщик мусора ждёт cfs_gc_delay
миллисекунд и продолжает проход по каталогу. Завершив проход, он ждёт дополнительно cfs_gc_period
миллисекунд и начинает новый проход. Если для CFS настроено несколько процессов сборки мусора, они разделяют свою работу по хешу дескриптора файла (inode).
CFS предоставляет различные функции для ручного управления сборкой мусора CFS и получения информации о состоянии и активности CFS. Полный список функций вы можете найти в Подразделе 9.26.12.
Чтобы запустить сборку мусора вручную, воспользуйтесь функцией cfs_start_gc(n_workers)
. Эта функция возвращает число рабочих процессов, которые были фактически запущены. Заметьте, что если параметр cfs_gc_workers
отличен от нуля, сборка мусора выполняется в фоне и функция cfs_start_gc
ничего не делает, а просто возвращает 0.
Как и процедура автоматического сбора мусора, функция cfs_start_gc(n_workers)
обрабатывает только те отношения, в которых процент мусорных блоков превосходит значение cfs_gc_threshold. Если вам нужно дефрагментировать отношение с меньшим процентом мусора, вы можете временно задать для этого параметра меньшее значение в текущем сеансе до вызова этой функции.
Эффект от сжатия таблицы можно оценить предварительно, воспользовавшись функцией cfs_estimate(relation)
. Эта функция считывает первые десять блоков отношения, пытается сжать их и возвращает средний коэффициент сжатия. Так, если она возвращает значение 7.8, это означает, что сжатая таблица будет занимать почти в 8 раз меньше места, чем исходная.
Функция cfs_compression_ratio(relation)
позволяет проверить, насколько точной была оценка, выданная функцией cfs_estimate(relation)
. Она возвращает фактический коэффициент сжатия для всех сегментов сжатого отношения. Коэффициент сжатия рассчитывается как результат деления общей суммы виртуальных размеров всех сегментов отношения (числа блоков, умноженного на 8 Кбайт) на сумму физических размеров его файлов сегментов.
Как было сказано ранее, CFS всегда добавляет изменённые строки в конец сжатого файла. Поэтому физический размер файла может быть больше объёма полезных данных в нём. Другими словами, файл CFS становится фрагментированным и поэтому сборщик мусора CFS периодически проводит в нём дефрагментацию. Функции cfs_fragmentation(relation)
возвращают средний коэффициент фрагментации файлов отношения, который вычисляется как результат деления суммы физических размеров файлов минус используемый объём в этих файлах на сумму физических размеров данных файлов.
Чтобы произвести дефрагментацию определённого сжатого отношения, воспользуйтесь функцией cfs_gc_relation(
. Она возвратит количество обработанных сегментов в данном отношении. Так же как и фоновая процедура сборки мусора, эта функция обрабатывает только те сегменты, в которых процент мусорных блоков превышает значение cfs_gc_threshold.отношение
)
Для наблюдения за активностью, связанной со сборкой мусора, предлагаются следующие функции: cfs_gc_activity_scanned_files
(возвращает число файлов, просканированных при сборке мусора), cfs_gc_activity_processed_files
(возвращает число файлов, сжатых при сборке мусора), cfs_gc_activity_processed_pages
(возвращает число страниц, перемещённых сборщиком мусора в процессе дефрагментации файлов) и cfs_gc_activity_processed_bytes
(возвращает общий объём перемещённых страниц). Все эти функции подсчитывают значения с момента запуска системы.