PostgreSQL14中新的LZ4TOAST压缩是什么?它有多快?
PostgreSQL14中新的LZ4TOAST压缩是什么?它有多快?
前⾔
此博客翻译⾃ 富⼠通 PG官⽅博客《What is the new LZ4 TOAST compression in PostgreSQL 14, and how fast is it?》
PostgreSQL 14 中引⼊的新列压缩选项 LZ4 提供了更快的压缩。我们该如何使⽤它,它的速度有多快?与 TOAST 中现有的 PGLZ 相⽐,它的压缩速度更快。在这篇博⽂中,我将描述如何使⽤此选项,并将其性能与其他压缩⽅法进⾏⽐较。
背景
在 PostgreSQL中,页是存储数据的基本单位,每页的⼤⼩默认为 8kB。基本上,⼀⾏中的数据不允许跨页存储。但是,某些数据类型具有可变长度,它们可能会超过⼀页的⼤⼩。为了克服这个限制,⼤字段值被压缩或(和)分解成多个物理⾏。这种技术被称为 TOAST (The Oversized-Attribute Storage Technique);
默认情况下,只有在表中存在变长列,并且⾏数据⼤⼩超过 TOAST_TUPLE_THRESHOLD(通常为 2 kB)时才会触发 TOAST。⾸先,数据将被压缩,然后,如果数据仍然太⼤,它将被离线存储。请注意,如果将列的存储策略指定为 EXTERNAL/PLAIN,则将禁⽤压缩。
在 PostgreSQL 14 之前,TOAST 仅⽀持⼀种压缩算法 - PGLZ,⼀种 PostgreSQL 内置算法。尽管其他压缩算法可能⽐ PGLZ 更快或具有更⾼的压缩率。
但从 PostgreSQL 14 开始,我们有另⼀种选择:LZ4 压缩——⼀种以速度著称的⽆损压缩算法。所以,我们可以期待它有助于提⾼TOAST 中压缩和解压的速度。
LZ4怎么⽤?
为了使⽤ PostgreSQL14 新增的 LZ4 压缩功能,需要在操作系统中安装 LZ4 相关的库,并在编译打包 PostgreSQL 时指定 --with-lz4选项。
将 LZ4 设置为默认压缩算法
您可以通过配置 GUC 参数 default_toast_compression 来指定 PostgreSQL 实例中 TOAST 的压缩算法。您也可以修改f 配置⽂件或使⽤ SET 命令仅针对当前客户端连接(会话)更改它。
配置 GUC 参数 default_toast_compression
怎样删除360>第二次战争使⽤ CREATE TABLE  设置列上的压缩算法
在 CREATE TABLE 上设置列压缩算法
我们使⽤\d+(⼀个 describe 命令)来显⽰所有列的压缩算法。如果该列不⽀持压缩或未指定压缩算法,则 Compression 列中将显⽰空⽩。
在上⾯的例⼦中,我们看到列 id 不⽀持压缩,col1 使⽤ PGLZ,col2 使⽤ LZ4,⽽ col3 没有指定压缩算法,因此它将使⽤默认压缩算法(PGLZ)。
使⽤ ALTER TABLE 修改列上的压缩算法
可以使⽤ ALTER TABLE 更改现有列的压缩算法,但请注意,新的压缩算法将仅应⽤于执⾏ ALTER TABLE 命令后插⼊的数据。
使⽤ ALTER TABLE 修改列上的压缩算法
上⾯我们看到,在我们更改压缩算法之前插⼊的⾏中,col1 仍然使⽤ PGLZ 进⾏压缩,即使我们将压缩从 PGLZ 更改为 LZ4。
笔记
1、如果从其他表插⼊数据,例如使⽤CREATE TABLE ... AS ...,或INSERT INTO ... SELECT ...,插⼊数据的压缩⽅法将与原始数据相同。淘宝开店经验
2、在⽀持 LZ4 的同时,pg_dump 和 pg_dumpall 还添加了选项 --no-toast-compression,使⽤时不会转储 TOAST 压缩选项。性能对⽐
这⾥我做了⼀些测试,⽐较了LZ4和PGLZ在压缩⽐和压缩速度⽅⾯的对⽐。作为参考,我添加了未压缩数据的测试结果(指定存储策略为EXTERNAL)。对于未压缩的数据,没有压缩和解压消耗的时间,但相应地,读取和写⼊数据所花费的时间增加。
准备
测试中使⽤了以下数据:
1、PostgreSQL ⽂档(每⾏⼀个 HTML ⽂件);
2、Silesia Corpus 提供的数据,包括:HTML、⽂本、源代码、可执⾏的⼆进制⽂件、图⽚;
测试服务器的处理器规格为 Intel® Xeon®*********************,10核/20线程/2插槽。
我使⽤ pgbench 来测量 SQL 执⾏时间,并使⽤系统函数 pg_table_size 来检查表⼤⼩(注意:在每次测试之前执⾏命令 VACUMM FULL 以清理数据存储)。
压缩率
PGLZ和LZ4的压缩率都与重复数据有关——重复项越多,压缩率越⾼。
但是,即使数据⼤⼩达到阈值,在 PostgreSQL 评估结果⽐率不佳的情况下,也不会执⾏压缩。这是因为压缩不会有效地节省磁盘空间,反⽽会导致额外的时间和资源来解压缩。
根据PostgreSQL14⽬前的源码,PGLZ要求⾄少25%的压缩率,⽽LZ4只要求压缩数据不⼤于未压缩数据。
我将使⽤压缩算法 LZ4 和 PGLZ 的表⼤⼩与未压缩算法进⾏了⽐较。我们可以看到,在⼤多数情况下,PULL 的压缩率稍微好⼀些-。平均⽽⾔,PGLZ的压缩率为2.23,LZ4的压缩率为2.07。这意味着与 LZ4 相⽐,PGLZ 可以节省⼤约 7% 的磁盘空间。
图 1 - ⽐较表⼤⼩(以 KB 为单位)
压缩/解压速度
TOAST 数据在插⼊/查询时被压缩/解压缩。所以,我执⾏了⼀些SQL语句,看看不同压缩算法对压缩/解压速度的影响。
IN SERT 语句
⾸先,我⽐较了使⽤ LZ4、使⽤ PGLZ 和不使⽤压缩的列中 INSERT 语句的性能。
我看到 LZ4 插⼊数据的时间⽐未压缩的略多,⽽使⽤ PGLZ 时,插⼊数据所花费的时间显着增加。平均⽽⾔,LZ4 压缩只需要 PGLZ 花费的时间的 20% 左右,LZ4 和 PGLZ在插⼊⽅⾯,有着⾮常显着的提⾼。
图 2 - ⽐较 INSERT 性能
超大文件传输
SELECT 语句
接下来,我⽐较了使⽤相同列压缩设置的 SELECT 语句的性能。
怎么做人结果是,在查询数据时,LZ4 ⽐PGLZ 减少了20%左右的时间,LZ4 和未压缩的相⽐没有明显的增加。似乎 LZ4 减压花费的时间已经减少到⾮常低的⽔平。
留学咨询机构推荐图 3 - ⽐较 SELECT 性能
16 个客户端的 INSERT 语句
我测试的另⼀个常见场景,从多个客户端访问数据库 - 在本例中为 16 个客户端。
我发现,如下所⽰,与 PGLZ 相⽐,使⽤ LZ4 的单个⼤⽂件(HTML、英⽂⽂本、源代码、可执⾏⼆进制⽂件、图⽚)的压缩性能要快60% 到 70%,并且在插⼊多个⼩⽂件(PostgreSQL ⽂档)时也有⼀个⼩的改进。
LZ4 与未压缩的相⽐,还有⼀个显着的改进,我猜这是因为使⽤压缩减少了写⼊磁盘的数据量。
图 4 - ⽐较 INSERT 性能(16 个客户端)
16 个客户端的 SELECT 语句

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。