El nuevo algoritmo de compresión LZ4 de TOAST en PostgreSQL 14. ¿Qué tan rápido puede ser?

Actualización: 2 de julio de 2023

Para las opciones de compresión de columnas, PostgreSQL 14 proporciona un nuevo método de compresión LZ4. En comparación con el método de compresión PGLZ existente en TOAST, la compresión LZ4 es más rápida. Este artículo describe cómo utilizar toda la opción y comparar su rendimiento con otros algoritmos de compresión.

fondo

En PG, la página es la unidad de almacenamiento de datos y el valor predeterminado es 8 KB. En general, no se permite almacenar una fila de datos entre páginas. Sin embargo, existen algunos tipos de datos de longitud variable y los datos almacenados pueden exceder una página de la universidad. Para superar toda la limitación, el campo grande se comprimirá o dividirá en varias filas físicas. Esta técnica es TOSTADA:

De forma predeterminada, si hay columnas de longitud variable en la tabla y el tamaño de los datos de la fila excede TOAST_TUPLE_THRESHOLD (predeterminado 2KB), se activará TOAST. Primero, los datos se comprimirán primero; si sigue siendo demasiado grande después de la compresión, el almacenamiento se desbordará. Cabe señalar que si la estrategia de almacenamiento de la columna especifica EXTERNAL / PLAIN, se prohibirá la compresión.

Antes de PG14, TOAST solo admite un algoritmo de compresión PGLZ (algoritmo integrado de PG). Pero otros algoritmos de compresión pueden ser más rápidos que PGLZ o tener una relación de compresión más alta. Hay una nueva opción de compresión LZ4 en PG14, que es un algoritmo de compresión sin pérdidas conocido por su velocidad. Por lo tanto, podemos esperar que ayude a aumentar la velocidad de compresión y descompresión de TOAST.

¿Cómo usar LZ4?

Para utilizar la función de compresión LZ4, debe especificar -with-lz4 al compilar y seguir la biblioteca LZ4 en el sistema operativo. El algoritmo de compresión predeterminado de TOAST de la instancia de PG se puede especificar mediante el parámetro GUC default_toast_compression. Puede estar en postgresql. Configure en conf, también puede cambiar solo la conexión actual a través del comando SET:

postgres = # SET default_toast_compression = lz4 ;

SET

Especifique el algoritmo de compresión de columnas al crear una tabla en CREATE TABLE:

Podemos usar el comando d + para ver el algoritmo de compresión para todas las columnas. Si la columna no admite o no especifica el algoritmo de compresión, se mostrará un espacio en la columna Compresión. En el ejemplo anterior, la columna id no admite el algoritmo de compresión, la columna col1 usa PGLZ, col2 usa LZ4 y col3 no especifica el algoritmo de compresión, entonces usará el algoritmo de compresión predeterminado.

Puede modificar el algoritmo de compresión de columnas a través de ALTER TABLE, pero debe tenerse en cuenta que el algoritmo modificado solo afecta los datos de inserción después de que se ejecute todo el comando.

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

INSERTAR 0 1

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

ALTERAR MESA

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

INSERTAR 0 1

postgres = # SELECT id ,

postgres- # pg_column_compression (id) AS compresión_colid ,

postgres- # pg_column_compression (col1) AS compresscol1 ,

postgres- # pg_column_compression (col2) AS compresscol2 ,

postgres- # pg_column_compression (col3) AS compresión_col3

postgres- # FROM tbl ;

id | compresión_colid |compresión_col1 |compresión_col2 |compresión_col3

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

1 | | pglz | lz4 | lz4

2 | | lz4 | lz4 | lz4

(2 filas)

Puede ver que para las filas insertadas antes de modificar el algoritmo de compresión, col1 todavía usa el algoritmo de compresión PGLZ, incluso si el algoritmo de compresión se modifica de PGLZ a LZ4. (Entonces, ¿qué algoritmo debería usarse para la descompresión después de la modificación?)

Tenga en cuenta que si escanea datos de otra tabla y los inserta en esta tabla, como CREAR TABLA. . . COMO. . . O INSERTAR EN. . . SELECCIONE. . . , El algoritmo de compresión utilizado por los datos insertados sigue utilizando el método de compresión de los datos originales. pg_dump y pg_dumpall también agregaron la opción-no-toast-compuression. Después de usar la opción completa, la opción de compresión TOAST no se descartará.

Comparación de rendimiento

Probó la tasa de compresión y la velocidad de compresión de LZ4 y PGLZ. Y agregó los resultados de la prueba de datos sin comprimir (la estrategia de almacenamiento especificada es EXTERNA). Para datos sin comprimir, no hay compresión ni descompresión que consuman mucho tiempo, pero el tiempo para leer y escribir datos aumentará.

Datos utilizados en la prueba: documentos PG (un archivo HTML por línea de datos); datos proporcionados por SilesiaCorpus, incluidos HTML, texto, código fuente, archivos binarios ejecutables e imágenes

Prueba de uso de la máquinaIntel? Xeon? Plata 4210 CPU @ 2.20GHz con 10 núcleos / 20 hilos / 2 enchufes。

Use pgbench para probar el tiempo de ejecución de la instrucción SQL y pg_table_size para verificar la tabla de la universidad (ejecute VACUUM FULL antes de cada ejecución para eliminar la influencia de los registros muertos).

Relación de compresión

Las tasas de compresión de PGLZ y LZ4 dependen de los datos repetidos. Cuantas más tuplas se repitan, mayor es la tasa de compresión. Sin embargo, si PG evalúa dicha tasa de compresión como no buena, no se realizará la compresión, incluso si el tamaño de los datos alcanza el umbral. Debido a que la compresión no ahorra espacio en disco de manera eficiente, también brinda tiempo adicional y consumo de recursos para los bloqueos de descompresión.

En el PG14 actual, PGLZ requiere una relación de compresión de al menos el 25%, mientras que LZ es solo más pequeño que cuando los datos no están comprimidos. Comparé los tamaños de tablas LZ4, PGLZ y tablas sin comprimir. Puede verse que en la mayoría de los escenarios, la relación de compresión de PGLZ es ligeramente mejor, la relación de compresión se evalúa como 2.23 y la relación de compresión de LZ4 es 2.07. Esto significa que PGLZ puede ahorrar un 7% del espacio en disco.

Figura 1 - Comparación de tamaños de tablas (en KB)

Velocidad de compresión / descompresión

Los datos de TOAST se comprimirán y descomprimirán durante la inserción y la consulta. Por lo tanto, ejecuté algunas declaraciones SQL para ver el impacto de diferentes algoritmos de compresión.

Primero, compare el rendimiento de la instrucción INSERT cuando usa LZ, PGLZ y no usa compresión. Se puede ver que en comparación con los datos sin comprimir, LZ4 lleva un poco más de tiempo y PGLZ lleva más tiempo. El tiempo de compresión de LZ4 es un 20% menor que el de PGLZ en promedio. Esta es una mejora muy significativa.

Figura 2 - Comparación del rendimiento de INSERT

Compare SELECT a continuación. En comparación con PGLZ, LZ4 puede ahorrar un 20% de tiempo y no hay mucha diferencia en comparación con los datos sin comprimir. El costo de la descompresión se ha reducido a un nivel muy bajo.

Figura 3 - Comparación del rendimiento de SELECT

Compare las declaraciones INSERT simultáneas de 16 clientes. En comparación con PGLZ, el rendimiento de compresión de archivos grandes individuales (HTML, texto en inglés, código fuente, archivos ejecutables binarios, imágenes) usando LZ4 es 60% -70% más rápido. Inserte varios archivos pequeños (archivos PG), el rendimiento no mejora. En comparación con los datos sin comprimir, hay una gran mejora. Se supone que el uso de la compresión reduce la cantidad de datos escritos en el disco.

Figura 4 - Comparación del rendimiento de INSERT con 16 clientes

Con 16 clientes SELECT, LZ4 funciona mejor que PGLZ en la mayoría de los escenarios:

Figura 5: Comparación del rendimiento de SELECT con 16 clientes

También compara la velocidad del procesamiento de texto usando las funciones de cadena SELECCIONAR y ACTUALIZAR. LZ4 es mejor que PGLZ en toda la escena. En comparación con los datos sin comprimir, los datos del algoritmo de compresión LZ4 tienen casi la misma velocidad de procesamiento de funciones, y el algoritmo LZ4 apenas afecta la velocidad de operación de la cadena.

Figura 6 - Comparación del rendimiento mediante funciones de cadena

En comparación con PGLZ, LZ4 comprime y descomprime los datos TOAST de manera más eficiente y proporciona un buen rendimiento. En comparación con los datos sin comprimir, la velocidad de consulta es casi la misma y, en comparación con PGLZ, la inserción es un 80% más rápida. Por supuesto, la tasa de compresión no es muy buena en algunos escenarios, pero si desea aumentar la velocidad de ejecución, se recomienda encarecidamente utilizar el algoritmo LZ4.

También es necesario prestar atención, es necesario considerar si los datos de la tabla son adecuados para la compresión. Si la relación de compresión no es buena, todavía intentará comprimir el número y luego se dará por vencido.RAMEl desperdicio de recursos y afecta en gran medida la velocidad de inserción de datos.

futuras

LZ4 ha mejorado enormemente el rendimiento de compresión y descompresión de TOAST. Además de LZ4, existen muchos otros algoritmos de compresión como Zstandard. Los usuarios que admiten Zstandard pueden obtener una mejor relación de compresión que PGLZ. LZ4 HC tiene una velocidad de compresión del 98.5% que la descompresión LZ4, pero puede aumentar considerablemente la tasa de compresión. Espero que la futura versión de PG pueda utilizar más algoritmos de compresión.

Además de TOAST, también es necesario comprimir otras escenas. Hasta donde yo sé, la versión de desarrollo actual ya es compatible con la compresión LZ4 de WAL, que es una característica interesante.