From 7c1849311e49ec57cb86b32a9aa630456588c3f0 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 4 Mar 2026 13:05:31 +0900 Subject: [PATCH] Change default value of default_toast_compression to "lz4", when available The default value for default_toast_compression was "pglz". The main reason for this choice is that this option is always available, pglz code being embedded in Postgres. However, it is known that LZ4 is more efficient than pglz: less CPU required, more compression on average. As of this commit, the default value of default_toast_compression becomes "lz4", if available. By switching to LZ4 as the default, users should see natural speedups on TOAST data reads and/or writes. Support for LZ4 in TOAST compression was added in Postgres v14, or 5 releases ago. This should be long enough to consider this feature as stable. --with-lz4 is removed, replaced by a --without-lz4 to disable LZ4 in the builds on an option-basis, following a practice similar to readline or ICU. References to --with-lz4 are removed from the documentation. While at it, quotes are removed from default_toast_compression in postgresql.conf.sample. Quotes are not required in this case. The in-place value replacement done by initdb if the build supports LZ4 would not use them in the postgresql.conf file added to a freshly-initialized cluster. For the reference, a similar switch has been done with ICU in fcb21b3acdcb. Some of the changes done in this commit are consistent with that. Note: this is going to create some disturbance in the buildfarm, in environments where lz4 is not installed. Author: Euler Taveira Reviewed-by: Peter Eisentraut Reviewed-by: Aleksander Alekseev Discussion: https://posgr.es/m/435df33a-129e-4f0c-a803-f3935c5a5ecb@eisentraut.org --- .cirrus.tasks.yml | 1 + configure | 6 ++++-- configure.ac | 2 +- doc/src/sgml/config.sgml | 13 ++++++------ doc/src/sgml/installation.sgml | 21 +++++++++++-------- doc/src/sgml/ref/alter_table.sgml | 4 +--- doc/src/sgml/ref/create_table.sgml | 4 +--- doc/src/sgml/ref/pg_receivewal.sgml | 4 +--- src/backend/access/common/toast_compression.c | 2 +- src/backend/utils/misc/guc_parameters.dat | 2 +- src/backend/utils/misc/postgresql.conf.sample | 2 +- src/bin/initdb/initdb.c | 5 +++++ src/include/access/toast_compression.h | 9 ++++++++ 13 files changed, 44 insertions(+), 31 deletions(-) diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml index 4841a204248..a3107f82730 100644 --- a/.cirrus.tasks.yml +++ b/.cirrus.tasks.yml @@ -984,6 +984,7 @@ task: --host=x86_64-w64-mingw32ucrt \ --enable-cassert \ --without-icu \ + --without-lz4 \ CC="ccache x86_64-w64-mingw32ucrt-gcc" \ CXX="ccache x86_64-w64-mingw32ucrt-g++" make -s -j${BUILD_JOBS} clean diff --git a/configure b/configure index b30b98a586e..7afd8ba01e8 100755 --- a/configure +++ b/configure @@ -1603,7 +1603,7 @@ Optional Packages: --with-system-tzdata=DIR use system time zone data in DIR --without-zlib do not use Zlib - --with-lz4 build with LZ4 support + --without-lz4 build without LZ4 support --with-zstd build with ZSTD support --with-ssl=LIB use LIB for SSL/TLS support (openssl) --with-openssl obsolete spelling of --with-ssl=openssl @@ -9570,7 +9570,9 @@ $as_echo "#define USE_LZ4 1" >>confdefs.h esac else - with_lz4=no + with_lz4=yes + +$as_echo "#define USE_LZ4 1" >>confdefs.h fi diff --git a/configure.ac b/configure.ac index f4e3bd307c8..60d1c1900f2 100644 --- a/configure.ac +++ b/configure.ac @@ -1188,7 +1188,7 @@ AC_SUBST(with_zlib) # LZ4 # AC_MSG_CHECKING([whether to build with LZ4 support]) -PGAC_ARG_BOOL(with, lz4, no, [build with LZ4 support], +PGAC_ARG_BOOL(with, lz4, yes, [build without LZ4 support], [AC_DEFINE([USE_LZ4], 1, [Define to 1 to build with LZ4 support. (--with-lz4)])]) AC_MSG_RESULT([$with_lz4]) AC_SUBST(with_lz4) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index f670e2d4c31..6779bc844d0 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -3498,10 +3498,9 @@ include_dir 'conf.d' etc.). A compressed page image will be decompressed during WAL replay. The supported methods are pglz, - lz4 (if PostgreSQL - was compiled with ) and - zstd (if PostgreSQL - was compiled with ). + lz4 and zstd (if + PostgreSQL was compiled with + ). The default value is off. Only superusers and users with the appropriate SET privilege can change this setting. @@ -10018,9 +10017,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; CREATE TABLE or ALTER TABLE.) The supported compression methods are pglz and - (if PostgreSQL was compiled with - ) lz4. - The default is pglz. + lz4. + The default is lz4 (if available); otherwise, + pglz. diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index b345a105674..a026ffea68d 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -975,15 +975,6 @@ build-postgresql: - - - - - Build with LZ4 compression support. - - - - @@ -1315,6 +1306,18 @@ build-postgresql: + + + + + + lz4 + + Prevents use of the LZ4 library. + + + + diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index aab2c6eb19f..9d2c87b660a 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -462,9 +462,7 @@ WITH ( MODULUS numeric_literal, REM its existing compression method, rather than being recompressed with the compression method of the target column. The supported compression - methods are pglz and lz4. - (lz4 is available only if - was used when building PostgreSQL.) In + methods are pglz and lz4. In addition, compression_method can be default, which selects the default behavior of consulting the setting diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml index 982532fe725..188bc11e940 100644 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -344,9 +344,7 @@ WITH ( MODULUS numeric_literal, REM has no direct effect, because such tables have no storage of their own, but the configured value will be inherited by newly-created partitions. The supported compression methods are pglz and - lz4. (lz4 is available only if - was used when building - PostgreSQL.) In addition, + lz4. In addition, compression_method can be default to explicitly specify the default behavior, which is to consult the diff --git a/doc/src/sgml/ref/pg_receivewal.sgml b/doc/src/sgml/ref/pg_receivewal.sgml index 9e353a068e5..1896f4da0e8 100644 --- a/doc/src/sgml/ref/pg_receivewal.sgml +++ b/doc/src/sgml/ref/pg_receivewal.sgml @@ -275,9 +275,7 @@ PostgreSQL documentation The compression method can be set to gzip, - lz4 (if PostgreSQL - was compiled with ) or - none for no compression. + lz4 or none for no compression. A compression detail string can optionally be specified. If the detail string is an integer, it specifies the compression level. Otherwise, it should be a comma-separated list of items, each of the diff --git a/src/backend/access/common/toast_compression.c b/src/backend/access/common/toast_compression.c index 4d00537049e..5a5d579494a 100644 --- a/src/backend/access/common/toast_compression.c +++ b/src/backend/access/common/toast_compression.c @@ -23,7 +23,7 @@ #include "varatt.h" /* GUC */ -int default_toast_compression = TOAST_PGLZ_COMPRESSION; +int default_toast_compression = DEFAULT_TOAST_COMPRESSION; #define NO_COMPRESSION_SUPPORT(method) \ ereport(ERROR, \ diff --git a/src/backend/utils/misc/guc_parameters.dat b/src/backend/utils/misc/guc_parameters.dat index 9507778415d..5ee84a639d8 100644 --- a/src/backend/utils/misc/guc_parameters.dat +++ b/src/backend/utils/misc/guc_parameters.dat @@ -735,7 +735,7 @@ { name => 'default_toast_compression', type => 'enum', context => 'PGC_USERSET', group => 'CLIENT_CONN_STATEMENT', short_desc => 'Sets the default compression method for compressible values.', variable => 'default_toast_compression', - boot_val => 'TOAST_PGLZ_COMPRESSION', + boot_val => 'DEFAULT_TOAST_COMPRESSION', options => 'default_toast_compression_options', }, diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index f938cc65a3a..e686d88afc4 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -779,7 +779,7 @@ #row_security = on #default_table_access_method = 'heap' #default_tablespace = '' # a tablespace name, '' uses the default -#default_toast_compression = 'pglz' # 'pglz' or 'lz4' +#default_toast_compression = pglz # pglz or lz4 #temp_tablespaces = '' # a list of tablespace names, '' uses # only default tablespace #check_function_bodies = on diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 53ec1544ff3..6387c66289e 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -1426,6 +1426,11 @@ setup_config(void) "0640", false); } +#if USE_LZ4 + conflines = replace_guc_value(conflines, "default_toast_compression", + "lz4", true); +#endif + /* * Now replace anything that's overridden via -c switches. */ diff --git a/src/include/access/toast_compression.h b/src/include/access/toast_compression.h index 5f3ffa9ab2d..3265f10b734 100644 --- a/src/include/access/toast_compression.h +++ b/src/include/access/toast_compression.h @@ -52,6 +52,15 @@ typedef enum ToastCompressionId #define CompressionMethodIsValid(cm) ((cm) != InvalidCompressionMethod) +/* + * Choose an appropriate default toast compression method. If lz4 is + * compiled-in, use it, otherwise use pglz. + */ +#ifdef USE_LZ4 +#define DEFAULT_TOAST_COMPRESSION TOAST_LZ4_COMPRESSION +#else +#define DEFAULT_TOAST_COMPRESSION TOAST_PGLZ_COMPRESSION +#endif /* pglz compression/decompression routines */ extern varlena *pglz_compress_datum(const varlena *value); -- 2.47.3