Новый алгоритм сжатия LZ4 от TOAST в PostgreSQL 14. Насколько быстрым он может быть?

Обновление: 2 июля 2023 г.

Для параметров сжатия столбцов PostgreSQL 14 предоставляет новый метод сжатия LZ4. По сравнению с существующим методом сжатия PGLZ в TOAST сжатие LZ4 работает быстрее. В этой статье описывается, как использовать весь параметр, и сравнивается его производительность с другими алгоритмами сжатия.

фон

В PG страница - это единица хранения данных, значение по умолчанию - 8 КБ. Как правило, ряд данных не может храниться на страницах. Однако есть некоторые типы данных переменной длины, и хранимые данные могут превышать одну страницу университета. Чтобы обойти все ограничение, большое поле будет сжато или разделено на несколько физических строк. Это ТОСТ:

По умолчанию, если в таблице есть столбцы переменной длины, а размер данных строки превышает TOAST_TUPLE_THRESHOLD (по умолчанию 2 КБ), TOAST будет активирован. Сначала данные будут сжаты; если после сжатия он все еще слишком велик, хранилище переполнится. Следует отметить, что если в стратегии хранения столбцов указано EXTERNAL / PLAIN, сжатие будет запрещено.

До PG14 TOAST поддерживает только один алгоритм сжатия PGLZ (встроенный алгоритм PG). Но другие алгоритмы сжатия могут быть быстрее PGLZ или иметь более высокую степень сжатия. В PG4 есть новая опция сжатия LZ14, которая представляет собой алгоритм сжатия без потерь, известный своей скоростью. Таким образом, мы можем ожидать, что это поможет увеличить скорость сжатия и распаковки TOAST.

Как использовать LZ4?

Чтобы использовать функцию сжатия LZ4, вам необходимо указать -with-lz4 при компиляции и следовать библиотеке LZ4 в операционной системе. Алгоритм сжатия TOAST по умолчанию для экземпляра PG можно указать с помощью параметра GUC default_toast_compression. Можно в postgresql. Настроить в conf, вы также можете изменить только текущее соединение с помощью команды SET:

postgres = # УСТАНОВИТЬ default_toast_compression = lz4 ;

УСТАНОВКА

Укажите алгоритм сжатия столбца при создании таблицы в CREATE TABLE:

Мы можем использовать команду d +, чтобы увидеть алгоритм сжатия для всех столбцов. Если столбец не поддерживает или не указывает алгоритм сжатия, то в столбце «Сжатие» будет отображаться пробел. В приведенном выше примере столбец id не поддерживает алгоритм сжатия, столбец col1 использует PGLZ, col2 использует LZ4, а col3 не указывает алгоритм сжатия, тогда он будет использовать алгоритм сжатия по умолчанию.

Вы можете изменить алгоритм сжатия столбца с помощью ALTER TABLE, но следует отметить, что измененный алгоритм влияет на данные вставки только после выполнения всей команды.

postgres = # INSERT INTO tbl VALUES (1 , repeat ('abc' , 1000) repeat ('abc' , 1000) repeat ('abc' , 1000)) ;

ВСТАВИТЬ 0 1

postgres = # ALTER TABLE tbl ALTER COLUMN col1 SET COMPRESSION lz4 ;

ALTER TABLE

postgres = # INSERT INTO tbl VALUES (2 , repeat ('abc' , 1000) repeat ('abc' , 1000) repeat ('abc' , 1000)) ;

ВСТАВИТЬ 0 1

postgres = # ВЫБРАТЬ идентификатор ,

postgres- # pg_column_compression (id) AS сжатие_colid ,

postgres- # pg_column_compression (col1) AS сжатие_col1 ,

postgres- # pg_column_compression (col2) AS сжатие_col2 ,

postgres- # pg_column_compression (col3) AS сжатие_col3

postgres- # ОТ tbl ;

id | сжатие_colid | сжатие_col1 сжатие_col2 | сжатие_col3

--- + ------------------- + ------------------ + -----

1 | | pglz | lz4 | lz4

2 | | lz4 | lz4 | lz4

(2 ряда)

Вы можете видеть, что для строк, вставленных перед изменением алгоритма сжатия, col1 по-прежнему использует алгоритм сжатия PGLZ, даже если алгоритм сжатия изменен с PGLZ на LZ4. (Итак, какой алгоритм следует использовать для декомпрессии после модификации?)

Обратите внимание, что если вы просматриваете данные из другой таблицы и вставляете их в эту таблицу, например, CREATE TABLE. . . В КАЧЕСТВЕ. . . Или ВСТАВИТЬ. . . ВЫБРАТЬ. . . , Алгоритм сжатия, используемый для вставленных данных, по-прежнему использует метод сжатия исходных данных. pg_dump и pg_dumpall также добавили параметр option-no-toast-compuression. После использования всего параметра параметр сжатия TOAST не сбрасывается.

Сравнение производительности

Проверял степень сжатия и скорость сжатия LZ4 и PGLZ. И добавил результаты тестирования несжатых данных (указана стратегия хранения ВНЕШНЯЯ). Для несжатых данных нет трудоемкого сжатия и распаковки, но время на чтение и запись данных увеличится.

Данные, использованные в тесте: документы PG (один HTML-файл на строку данных); данные, предоставленные SilesiaCorpus, включая HTML, текст, исходный код, исполняемые двоичные файлы и изображения

Использование тестовой машиныIntel? Xeon? Серебро 4210 ЦП @ 2.20 ГГц с 10 ядрами / 20 потоков / 2 сокета。

Используйте pgbench, чтобы проверить время выполнения оператора SQL, и pg_table_size, чтобы проверить университет таблицы (выполняйте VACUUM FULL перед каждым выполнением, чтобы исключить влияние мертвых записей).

Коэффициент сжатия

Степень сжатия PGLZ и LZ4 зависит от повторяющихся данных. Чем больше повторяющихся кортежей, тем выше степень сжатия. Однако, если PG оценивает такую ​​степень сжатия как плохую, сжатие не будет выполняться, даже если размер данных достигнет порогового значения. Поскольку сжатие не позволяет эффективно экономить дисковое пространство, оно также требует дополнительного времени и ресурсов для блокировки декомпрессии.

В текущем PG14 PGLZ требует степени сжатия не менее 25%, в то время как LZ только меньше, чем при несжатых данных. Я сравнил размеры таблиц LZ4, PGLZ и несжатых таблиц. Можно видеть, что в большинстве сценариев степень сжатия PGLZ немного лучше, степень сжатия оценивается как 2.23, а степень сжатия LZ4 составляет 2.07. Это означает, что PGLZ может сэкономить 7% дискового пространства.

Рисунок 1 - Сравнение размеров таблиц (в КБ)

Скорость сжатия / декомпрессии

Данные TOAST будут сжиматься и распаковываться во время вставки и запроса. Поэтому я выполнил несколько операторов SQL, чтобы увидеть влияние различных алгоритмов сжатия.

Сначала сравните производительность оператора INSERT при использовании LZ, PGLZ и без сжатия. Видно, что по сравнению с несжатыми данными LZ4 занимает немного больше времени, а PGLZ - больше. Время сжатия LZ4 в среднем на 20% меньше, чем у PGLZ. Это очень значительное улучшение.

Рисунок 2 - Сравнение производительности INSERT

Сравните SELECT ниже. По сравнению с PGLZ, LZ4 может сэкономить 20% времени, и нет большой разницы по сравнению с несжатыми данными. Стоимость декомпрессии снижена до очень низкого уровня.

Рисунок 3 - Сравнение производительности SELECT

Сравните одновременные операторы INSERT 16 клиентов. По сравнению с PGLZ производительность сжатия отдельных больших файлов (HTML, английский текст, исходный код, двоичные исполняемые файлы, изображения) с использованием LZ4 на 60% -70% выше. Вставьте несколько небольших файлов (файлы PG), производительность не улучшится. По сравнению с несжатыми данными это огромное улучшение. Предполагается, что использование сжатия уменьшает объем данных, записываемых на диск.

Рисунок 4 - Сравнение производительности INSERT с 16 клиентами

С 16 клиентскими SELECT LZ4 работает лучше, чем PGLZ в большинстве сценариев:

Рисунок 5 - Сравнение производительности SELECT с 16 клиентами

Он также сравнивает скорость обработки текста с помощью строковых функций SELECT и UPDATE. LZ4 лучше, чем PGLZ во всей сцене. По сравнению с несжатыми данными, данные алгоритма сжатия LZ4 имеют практически одинаковую скорость обработки функций, а алгоритм LZ4 практически не влияет на скорость работы со строкой.

Рисунок 6 - Сравнение производительности с использованием строковых функций

По сравнению с PGLZ, LZ4 сжимает и распаковывает данные TOAST более эффективно и обеспечивает хорошую производительность. По сравнению с несжатыми данными скорость запроса почти такая же, а по сравнению с PGLZ вставка на 80% быстрее. Конечно, в некоторых сценариях степень сжатия не очень хорошая, но если вы хотите увеличить скорость выполнения, настоятельно рекомендуется использовать алгоритм LZ4.

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

будущее

LZ4 значительно улучшил производительность сжатия и декомпрессии TOAST. Помимо LZ4, существует множество других алгоритмов сжатия, таких как Zstandard. Пользователи, поддерживающие Zstandard, могут получить лучшую степень сжатия, чем PGLZ. LZ4 HC имеет скорость сжатия 98.5%, чем декомпрессия LZ4, но может значительно увеличить степень сжатия. Надеюсь, что в будущей версии PG можно будет использовать больше алгоритмов сжатия.

Помимо TOAST, необходимо сжать и другие сцены. Насколько мне известно, текущая разрабатываемая версия уже поддерживает сжатие WAL LZ4, что является замечательной функцией.