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 (возвращает общий объём перемещённых страниц). Все эти функции подсчитывают значения с момента запуска системы.