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

    文章

    4456

    浏览量

    90758
  • SQL
    SQL
    +关注

    关注

    1

    文章

    738

    浏览量

    43462
收藏 人收藏

    评论

    相关推荐

    FPGA压缩算法有哪些

    在图像压缩算法中可以采用哈夫曼编码的方式对编码冗余的信息进行压缩,可以采用预测的方式来减少像素间冗余,可以采用量化的方式完成心理视觉冗余信息的去除
    的头像 发表于 04-15 11:48 182次阅读
    FPGA<b class='flag-5'>压缩</b><b class='flag-5'>算法</b>有哪些

    基于门控线性网络(GLN)的高压缩比无损医学图像压缩算法

    实现基于门控线性网络(GLN)的高压缩比无损医学图像压缩算法,以提高医学图像存储和分发系统的效率。与“传统”的基于上下文的数据压缩算法相比,
    的头像 发表于 04-08 10:29 172次阅读
    基于门控线性网络(GLN)的高<b class='flag-5'>压缩</b>比无损医学图像<b class='flag-5'>压缩</b><b class='flag-5'>算法</b>

    【LicheeRV-Nano开发套件试用连载体验】 + 2、镜像烧录

    /releases 1、下载官方制作好的镜像文件到ubuntu; 2、PC插入TF卡; 3、输入命令烧录:lz4 -d licheervnano-20240206-0802.img.lz4 | sudo
    发表于 03-08 09:50

    如何在Delphi中使用Devart PgDAC连接PostgreSQL

    PostgreSQL是一种流行的开源关系数据库管理系统(RDBMS),广泛用于构建健壮且可扩展的应用程序。
    的头像 发表于 12-06 09:04 441次阅读

    为什么选择 PostgreSQL

    认识PostgreSQL PostgreSQL 是一款开源的、高度可扩展的关系型数据库管理系统 (RDBMS)。它由一个强大的开发社区支持,自1996年以来持续不断地发展和改进。 它支持高级功能
    的头像 发表于 09-30 10:25 868次阅读

    PostgreSQL中可用的各种数据类型

    PostgreSQL是一种功能强大的开源关系型数据库管理系统,具有广泛的数据类型支持。在本教程中,我们将介绍PostgreSQL中可用的各种数据类型,包括数值、字符串、几何、时间、日期、布尔、货币
    的头像 发表于 09-19 14:08 1025次阅读

    如何快速完成PostgreSQL数据迁移?

    NineData推出了PostgreSQL业务不停服数据迁移能力。NineData实现了完全自动化的结构迁移和全量数据迁移,并提供了变更数据的迁移能力。这种能力可以实时监听源PostgreSQL
    的头像 发表于 08-14 15:39 1903次阅读
    如何快速完成<b class='flag-5'>PostgreSQL</b>数据迁移?

    智能管理,NineData支持最受欢迎数据库PostgreSQL

    NineData新增了PostgreSQL数据源的支持,这是一个可视化、集成AI、多云多环境、拥有企业级能力的PostgreSQL解决方案。无论您是个人开发者还是团队,都可以通过NineData平台一站式管理您的PostgreSQL
    的头像 发表于 07-27 16:39 272次阅读
    智能管理,NineData支持最受欢迎数据库<b class='flag-5'>PostgreSQL</b>

    PostgreSQL 插件那么多,怎样管理最高效?

    PostgreSQL 发展至今,华为云已经从 PostgreSQL 9.5 版本演进到 PostgreSQL 14 版本,目前共支持 7 个大版本,每个大版本可以支
    的头像 发表于 06-30 16:21 209次阅读
    <b class='flag-5'>PostgreSQL</b> 插件那么多,怎样管理最高效?

    恒讯科技介绍:PostgreSQL服务器配置的参数指南

    PostgreSQ服务器配置参数在优化和增强数据库性能方面发挥着重要作用。PostgreSQL的主要可调设置位于名为 postgresql.conf 的纯文本文件中,该文件位于数据库目录结构的底部。这些配置参数中的大多数大致分为以下几类:
    的头像 发表于 06-16 17:36 861次阅读

    Android自定义Toast Kotlin

    电子发烧友网站提供《Android自定义Toast Kotlin.zip》资料免费下载
    发表于 06-16 11:43 0次下载
    Android自定义<b class='flag-5'>Toast</b> Kotlin

    冰箱压缩机不转的原因

    冰箱压缩机不转可能有以下原因:   1.电源问题:首先检查冰箱的电源插头是否插紧,是否有电,电源线是否破损等,这些也可能导致冰箱压缩机不转。   2.压缩机损坏:如果冰箱
    的头像 发表于 06-03 10:30 3007次阅读

    zSwap 技术压缩算法介绍

    压缩可以降低占用空间,顾名思义,内存压缩就是压缩内存,节省内存空间。就目前的技术而言, I/O 的速度远远慢于这 RAM 操作速度。因此,如果频繁地做 I/O 操作,不仅影响 flash 使用寿命
    的头像 发表于 05-19 09:25 830次阅读

    Devart:PostgreSQL GUI工具2023(下)

    HeidiSQL是一个用户友好的、免费的、开源的解决方案,具有方便的图形界面,用于管理PostgreSQL和其他流行的数据库管理系统上的数据库。它重量轻,操作简单。尽管它可能不具备付费ide的所有高级特性
    的头像 发表于 05-17 11:07 572次阅读
    Devart:<b class='flag-5'>PostgreSQL</b> GUI工具2023(下)

    如何在Linux上使用Pigz来更快地压缩文件

    Pigz是一款快速压缩文件的工具,它能够使用多个CPU核心进行压缩,使得压缩速度得到了极大的提升。在本文中,我们将介绍如何在Linux上使用Pigz来更快地
    的头像 发表于 05-12 16:42 1905次阅读
    如何在Linux上使用Pigz来更快地<b class='flag-5'>压缩</b>文件