0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PostgreSQL 14中TOAST的新压缩算法LZ4,它能有多快?

微云疏影 来源:yzsDBA 作者:yzsDBA 2023-01-24 15:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

对于列压缩选项,PostgreSQL 14提供了新的压缩方法LZ4。与TOAST中现有的PGLZ压缩方法相比,LZ4压缩更快。本文介绍如何使用整个选项,并和其他压缩算法进行性能比较。

背景

PG中,页是存储数据的单位,默认是8KB。一般情况下,一行数据不允许跨页存储。然而,有一些变长的数据类型,存储的数据可能超出一页大学。为了克服整个限制,大字段域会被压缩或者分割成多个物理行。这个技术就是TOAST:

默认情况下,如果表中有变长列,行数据的大小超过TOAST_TUPLE_THRESHOLD(默认2KB)就会触发TOAST。首先,会先压缩数据;压缩后如果仍然太大,会溢出存储。需要注意,如果列的存储策略指定EXTERNAL/PLAIN,压缩会被禁止。

PG14之前版本,TOAST仅支持一个压缩算法PGLZ(PG内置算法)。但是其他压缩算法可能比PGLZ更快或者有更高的压缩率。PG14中有了新压缩选项LZ4压缩,这是一个以速度著称的无损压缩算法。因此我们可以期望它有助于提高TOAST压缩和解压缩的速度。

如何使用LZ4?

为了使用LZ4压缩特性,在编译时需要指定--with-lz4,并且在操作系统中按照LZ4库。通过GUC参数default_toast_compression可以指定PG实例的TOAST默认压缩算法。可以在postgresql.conf中配置,也可以通过SET命令仅改变当前连接:

postgres=# SET default_toast_compression=lz4;

SET

在CREATE TABLE创建表时指定列压缩算法:

image.png

我们使用d+命令可以看到所有列的压缩算法。如果列不支持或者没有指定压缩算法,那么会在Compression列显示空格。上面的例子中,id列不支持压缩算法,col1列使用PGLZ,col2使用LZ4,col3没有指定压缩算法,那么它会使用默认的压缩算法。

可以通过ALTER TABLE修改列压缩算法,但需要注意,修改后的算法仅影响执行整个命令后的insert数据。

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

INSERT 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));

INSERT 0 1

postgres=# SELECT id,

postgres-# pg_column_compression(id) AS compression_colid,

postgres-# pg_column_compression(col1) AS compression_col1,

postgres-# pg_column_compression(col2) AS compression_col2,

postgres-# pg_column_compression(col3) AS compression_col3

postgres-# FROM tbl;

id | compression_colid | compression_col1 | compression_col2 | compression_col3

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

1 | | pglz | lz4 | lz4

2 | | lz4 | lz4 | lz4

(2 rows)

可以看到在修改压缩算法前插入的行,col1仍使用PGLZ压缩算法,即使将压缩算法从PGLZ修改到了LZ4。(那么,修改后进行解压时使用哪个算法呢?)

需要注意,如果从其他表扫数据插入本表,例如CREATE TABLE ...AS...或者INSERT INTO...SELECT...,插入的数据使用的压缩算法仍然使用原始数据的压缩方法。pg_dump和pg_dumpall也添加了选项--no-toast-compuression,使用整个选项后,不会dump出TOAST压缩选项。

性能比较

测试了LZ4和PGLZ压缩率和压缩速度。并添加了未压缩数据的测试结果(指定存储策略为EXTERNAL),对于未压缩数据,没有压缩和解压的耗时,但读和写数据的时间会增加。

测试使用的数据:PG documents(一行数据一个HTML文件);SilesiaCorpus提供的数据,包括HTML、Text、源代码、可执行二进制文件、图片

测试机器使用Intel? Xeon? Silver 4210CPU@2.20GHz with 10 cores/20 threads/2 sockets。

使用pgbench测试SQL语句执行时间,pg_table_size检查表大学(每次执行前都执行VACUUM FULL排除死记录的影响)。

压缩率

PGLZ和LZ4的压缩率都依赖于重复数据,重复的元组越多,压缩率越高。但是如果PG评估这样的压缩率不好时,就不会执行压缩,即使数据大小达到了阈值。因为压缩并没有高效节省磁盘空间,还会带来解压锁的额外时间和资源消耗。

当前PG14中,PGLZ需要至少25%的压缩率,LZ则仅比未压缩数据时小即可。我比较了LZ4、PGLZ的表与未压缩表大小。可以看到,大部分场景下,PGLZ的压缩率稍微好点,压缩率评价为2.23,LZ4的压缩率为2.07。这意味着PGLZ可以节省7%的磁盘空间。

poYBAGO307yAMhZTAALAcjHIJ5Q514.jpg

Figure 1 - Comparing table sizes (in KB)

压缩/解压缩速度

Insert和查询时TOAST数据会被压缩和解压缩。因此,我执行一些SQL语句查看不同压缩算法带来的影响。

首先比较了INSERT语句,列使用LZ、PGLZ和未使用压缩时的性能。可以看到与未压缩数据比,LZ4耗费稍微多一点时间,PGLZ耗费时间更多。LZ4的压缩时间比PGLZ平均节省20%。这是一项非常显著的改进。

pYYBAGO3072AYW3gAAKf7xUZ0GA941.jpg

Figure 2 - Comparing INSERT performance

下面比较SELECT。与PGLZ相比,LZ4可以节省20%的时间,与未压缩数据相比,没有太大差别。解压缩的消耗已经降到了很低了。

poYBAGO3072AG4HgAAFUDQ_9v08530.jpg

Figure 3 - Comparing SELECT performance

再比较16个客户端的INSERT语句并发。与PGLZ相比使用LZ4的单大文件(HTML,英文文本,源代码,二进制执行文件,图片)的压缩性能快60%-70%。插入多个小文件(PG文档),性能提升不大。和未压缩的数据相比,有巨大提升,猜测使用压缩减少了写入磁盘的数据量。

poYBAGO3072AAVfUAAFgxdf_G3I282.jpg

Figure 4 - Comparing INSERT performance with 16 clients

16个客户端的SELECT,多数场景下,LZ4性能优于PGLZ:

pYYBAGO3076AEIlgAAF4vrnCcPM768.jpg

Figure 5 - Comparing SELECT performance with 16 clients

同样也比较了使用字符串函数的SELECT、UPDATE处理文本的速度。整个场景下LZ4优于PGLZ。LZ4压缩算法的数据与未压缩数据相比,函数处理的速度几乎一样,LZ4算法几乎不会影响字符串操作速度。

poYBAGO307-AKz0pAAFMS33wzeQ709.jpg

Figure 6 - Comparing performance using string functions

与PGLZ相比,LZ4压缩和解压缩TOAST数据更加高效,并提供很好的性能。和未压缩数据相比,查询速度几乎一样,和PGLZ相比,插入快80%。当然某些场景下压缩率不太好,但如过你想要提升执行速度,强烈推荐使用LZ4算法。

同样需要注意,需要考虑表中的数据是否合适压缩。如果压缩率不好,它仍然会尝试压缩数,然后放弃。这将导致额外的内存资源浪费,并极大影响插入数据的速度。

未来

LZ4对TOAST的压缩和解压缩性能带来了很大提升。除了LZ4,还有很多其他压缩算法比如Zstandard。支持Zstandard用户可以得到比PGLZ更好的压缩率。LZ4 HC具有比LZ4解压98.5%的压缩速度,但是可以大幅提升压缩率。希望未来PG版本可以使用更多的压缩算法。

除了TOAST外,其他场景也需要压缩。据我所知,目前开发版本已经支持WAL的LZ4压缩,这是一项令人兴奋的特性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4816

    浏览量

    98797
  • SQL
    SQL
    +关注

    关注

    1

    文章

    809

    浏览量

    47022
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探索 HMC695LP4 / HMC695LP4E:高性能有源频率倍增器

    探索 HMC695LP4 / HMC695LP4E:高性能有源频率倍增器 在电子工程领域,频率倍增器是一种至关重要的器件,它能够将输入信号的频率进行倍数提升,广泛应用于各种通信、雷达等
    的头像 发表于 05-22 09:05 308次阅读

    深入解析FDT86102LZ N沟道MOSFET:特性、应用与设计考量

    (onsemi)的FDT86102LZ N沟道MOSFET,看看它有哪些独特之处,以及在实际应用需要注意的要点。 文件下载: FDT86102LZ-D.pdf 一、产品概述 FDT86102
    的头像 发表于 04-20 15:15 164次阅读

    Onsemi FDT86113LZ N沟道MOSFET:技术特性与应用价值

    Onsemi FDT86113LZ N沟道MOSFET:技术特性与应用价值 MOSFET作为电子电路的关键元件,在各类电源管理和开关电路中发挥着重要作用。今天,我们来深入探讨Onsemi公司
    的头像 发表于 04-20 15:05 170次阅读

    onsemi FDMA86108LZ MOSFET:高效同步降压转换器的理想之选

    onsemi FDMA86108LZ MOSFET:高效同步降压转换器的理想之选 在电子设备设计,MOSFET是不可或缺的关键元件,其性能直接影响到整个电路的效率和稳定性。今天,我们来深入了解一下
    的头像 发表于 04-17 11:10 203次阅读

    深入解析FDMS86102LZ N-Channel Shielded Gate PowerTrench® MOSFET

    深入解析FDMS86102LZ N-Channel Shielded Gate PowerTrench® MOSFET 引言 在电子工程领域,MOSFET作为重要的功率器件,广泛应用于各种电路设计
    的头像 发表于 04-16 09:10 421次阅读

    探索HMC504LC4B:14 - 27 GHz低噪声放大器的卓越性能

    探索HMC504LC4B:14 - 27 GHz低噪声放大器的卓越性能 在微波和射频领域,低噪声放大器(LNA)是至关重要的组件,它能有效放大微弱信号,同时尽量减少噪声干扰。今天我们要深入探讨
    的头像 发表于 03-15 16:35 848次阅读

    电能质量在线监测装置数据压缩对装置性能有哪些影响?

    电能质量在线监测装置的数据压缩功能对性能的影响 总体可控且轻微 ,核心集中在「CPU 占用、内存消耗、存储读写速度、数据传输延迟」四大维度,且通过厂商优化(硬件加速、算法选型、资源调度)可将负面影响
    的头像 发表于 12-17 10:28 565次阅读
    电能质量在线监测装置数据<b class='flag-5'>压缩</b>对装置性<b class='flag-5'>能有</b>哪些影响?

    如何配置电能质量在线监测装置的数据压缩存储功能?

    (FPGA/DSP),支持全类型数据压缩 端装置 (工业侧):软件压缩 (LZ4/ZLIB),支持稳态数据和报表压缩 经济型装置 (低压
    的头像 发表于 12-17 10:26 694次阅读
    如何配置电能质量在线监测装置的数据<b class='flag-5'>压缩</b>存储功能?

    电能质量在线监测装置支持哪些数据压缩算法

    增强。以下是主流算法的详细支持情况: 一、无损压缩算法(核心用于关键数据) 算法名称 核心原理 适用数据类型 压缩比 装置支持情况 DEFL
    的头像 发表于 12-12 14:08 803次阅读
    电能质量在线监测装置支持哪些数据<b class='flag-5'>压缩</b><b class='flag-5'>算法</b>?

    电能质量在线监测装置的数据压缩存储功能支持的数据格式可以修改吗?

    操作性与法律效力 压缩算法 / 容器格式 ZLIB、GZIP、ZIP、LZ4 部分可配置 厂家会提供有限选择
    的头像 发表于 12-11 16:39 1292次阅读
    电能质量在线监测装置的数据<b class='flag-5'>压缩</b>存储功能支持的数据格式可以修改吗?

    SM4算法实现分享(一)算法原理

    SM4分组加密算法采用的是非线性迭代结构,以字为单位进行加密、解密运算,每次迭代称为一轮变换,每轮变换包括S盒变换、非线性变换、线性变换、合成变换。加解密算法与密钥扩展都是采用32轮非线性迭代结构
    发表于 10-30 08:10

    国密系列算法简介及SM4算法原理介绍

    在后续分享中分析AES和SM4算法的共同特点和可重构方法。 二、 SM4算法原理 图2所示为128位输入、128位密钥和128位输出的SM4
    发表于 10-24 08:25

    优化boot4的乘法运算周期

    可以在不同的时钟周期内完成,从而并行化运算流程,提高乘法器的运算性能。 采用多级压缩:在Boot4乘法器,使用了基于连乘算法的多级压缩技术
    发表于 10-21 13:17

    低内存场景下的高效压缩利器:FastLZ压缩库应用实践指南

    联网设备等场景的严苛需求。 FastLZ ——是一款高效且小巧的开源压缩库,主要用于实现基于LZ77算法的字节对齐数据压缩LZ77(Lem
    的头像 发表于 07-22 15:13 564次阅读
    低内存场景下的高效<b class='flag-5'>压缩</b>利器:FastLZ<b class='flag-5'>压缩</b>库应用实践指南

    基于FPGA的压缩算法加速实现

    本设计,计划实现对文件的压缩及解压,同时优化压缩中所涉及的信号处理和计算密集型功能,实现对其的加速处理。本设计的最终目标是证明在充分并行化的硬件体系结构 FPGA 上实现该算法时,可
    的头像 发表于 07-10 11:09 2690次阅读
    基于FPGA的<b class='flag-5'>压缩</b><b class='flag-5'>算法</b>加速实现