32.3. Использование сжатия

Сжатие можно включить только для отдельных табличных пространств. Чтобы сделать табличное пространство сжимаемым, нужно установить параметр compression при создании этого пространства. Например:

    postgres=# CREATE TABLESPACE zfs LOCATION '/var/data/cfs' WITH (compression=true);
  

Все таблицы, создаваемые в этом табличном пространстве, будут сжиматься с использованием применяемого по умолчанию алгоритма zstd.

Помимо логического значения для этого параметра вы можете явно указать библиотеку, которая будет использоваться для сжатия. Возможные варианты: zstd, default (действует так же, как zstd), pglz, zlib и lz4. Например, чтобы использовать zlib, создайте табличное пространство так:

    postgres=# CREATE TABLESPACE zfs1 LOCATION '/var/data/cfs1' WITH (compression='zlib');
  

Заданные при создании табличного пространства параметры сжатия изменить нельзя, в частности, невозможно сделать ранее сжатое пространство несжатым и наоборот. Системные отношения не сжимаются никогда.

Если вы хотите, чтобы сжимались все таблицы, создаваемые в текущем сеансе, вы можете сделать сжатое табличное пространство пространством по умолчанию, как описано в Разделе 22.6.

Примечание

В сжатых табличных пространствах утилиты pg_checksums и pg_basebackup не будут проверять контрольные суммы независимо от того, включены они или нет.

Для настройки CFS используйте параметры, описанные в Разделе 19.15. По умолчанию CFS запускает для сборки мусора один рабочий процесс. Сборщик мусора проходит по каталогу табличного пространства, находит в нём файлы отображений и проверяет в них процент мусора. Если отношение неиспользуемого объёма к общему превышает значение cfs_gc_threshold, этот файл дефрагментируется. На время дефрагментации файл блокируется, в результате чего ни к какой его части нельзя обратиться. Чтобы избежать зависания в случае ошибки при сборке мусора, CFS ждёт снятия блокировки с файла cfs_gc_respond_time секунд. Если блокировка не снимается, в журнал записывается предупреждение. По завершении дефрагментации сборщик мусора ждёт cfs_gc_delay миллисекунд и продолжает проход по каталогу. Завершив проход, он ждёт дополнительно cfs_gc_period миллисекунд и начинает новый проход. Если для CFS настроено несколько процессов сборки мусора, они разделяют свою работу по хешу дескриптора файла (inode).

CFS предоставляет различные функции для ручного управления сборкой мусора CFS и получения информации о состоянии и активности CFS. Полный список функций вы можете найти в Подразделе 9.27.11.

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