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

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

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

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

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

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

Заданные при создании табличного пространства параметры сжатия изменить нельзя, в частности, невозможно сделать ранее сжатое пространство несжатым и наоборот. Хотя пользовательские отношения в CFS всегда сжимаются, этого не происходит с системными отношениями, если числовая часть имени файла, например, pg_relation_filenode(), меньше 16384 (за дополнительной информацией обратитесь к Таблице 9.90).

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

Примечание

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

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

Несколько функций позволяют рассчитать объём, который занимают на диске различные объекты в CFS. Например:

  • pg_relation_size() вычисляет объём, который занимает на диске отношение в CFS.

  • pg_total_relation_size() вычисляет общий объём, который занимает на диске указанная таблица в CFS с учётом всех индексов и данных TOAST.

  • pg_indexes_size() вычисляет общий объём, который занимают на диске индексы, связанные с указанной таблицей, в CFS.

  • pg_database_size() вычисляет объём, который занимает на диске указанная база данных в CFS.

За дополнительной информацией обратитесь к Подразделу 9.26.7.

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