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

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

3天内不再提示

PostgreSQL 14新特性:减少索引膨胀

li5236 来源:yzsDBA 作者:yzsDBA 2022-03-29 15:38 次阅读

PostgreSQL 14新特性--减少索引膨胀

PG12中索引的存储更加高效,PG13添加索引条目去重功能进一步提升存储效率。PG14将带来“自底向上”的索引条目去除功能,旨在减少不必要的页面分裂、索引膨胀和更新大量索引带来的碎片。

为什么会出现索引膨胀

对于B-tree索引,表中每个行版本都有一个未死的索引条目(对所有人可见)。执行vacuum删除死记录时,也会删除对应的索引条目。和表一样,同样会在索引页中创建空的空间。这样的空间可以重用,但是如果没有新元组插入该页,这样的空间会保持为空。

这种膨胀在某种程度上是不可避免的,也是正常的。但如果膨胀太多,索引效率就会降低:

1) 对于索引范围扫描,必须扫描更多的页

2) RAM中缓存了索引页,意味着缓冲膨胀,就是浪费了RAM

3) 每个页中更少的索引条目意味着更少的“fan out”,索引树的层级将更高

如果频繁更新相同行,就会发生这种情况。VACUUM清理老元组前,表和索引会维护相同行的很多版本。如果索引页填满,将令人很烦:然后PG会将索引页分裂成2个。这是一个昂贵的操作,VACUUM执行完清理,我们最终会得到2个臃肿的页面而不是一个。

当前用于改善索引膨胀和性能的特性HOT元组

HOT元组的创建可能是PG对抗索引中不必要条目的强大武器。使用此功能UPDATE创建产生的元组不会被索引条目引用,它还会引用元组的老版本。通过这种方法,不需要创建新的索引条目,可以避免索引膨胀。

杀死索引条目

当索引扫描遇到一个指向死元组的条目时,标记该条目“killed”。后续索引扫描会在VACUUM删除他们之前跳过这些条目。此外,PG可以在索引页面已满时删除这样的条目,以避免页分裂。

PG14如何进一步减少索引膨胀

自下而上的索引元组删除比之前方法更进一步:他在索引页分裂即将发生前就删除指向死元组的索引条目。这可以减少索引条目的数量并避免昂贵的分裂,以及稍后VACUUM清理参数的膨胀。

在某种程度上,这执行了之前VACUUM的部分公众,在这点上可以避免索引膨胀。

案例

为了演示新功能效果,使用pgbench分别在PG13和14上执行操作:

测试表:

image.png

Pgbench名为bench.sql的脚本:

image.png

我运行脚本 60000 次(6 个客户端 10000 次迭代),如下所示:

pgbench -n -c 6 -f bench.sql -t 10000 test

比较测试结果

我们使用pgstattuple扩展来获取psql 的索引统计信息

image.png

这是我们在 v13 中得到的:

image.png

对于 v14,结果是:

image.png

改进最大的时testtab_unchanged_idx。在13中,索引膨胀严重,而在14中仅有60%的膨胀(这对索引来说还不错)。在这里我们看到了新功能的最大影响。UPDATE不扫扫描那个索引,因此没有killed的索引条目,“自底向上的删除”可以删除足够的这样的条目避免分裂。

也可以衡量testtab_pkey。由于UPDATE扫描该索引,死的索引元组被killed,新特性在分裂前删除这些元组。与13相比,效果不太明显,因为13已经很好地避免索引膨胀了。

索引testtab_changed_idx无法从新特性中获益。因为这进解决了UPDATE不修改索引值的情况。如果想知道为什么testtab_unchanged_idx叶子密度比13低:删除了索引重复数据。

Pg_upgrade后我们可以使用这项功能吗?

索引的存储格式没有变,所以pg_upgrade PG12及之后版本创建的索引后会自动公众。但之前版本创建的索引,需要REINDEX后获益。记住,pg_upgrade仅拷贝索引文件,不会更改内部索引版本。

总结

PG14继续改进B-tree索引。这个特性虽不是革命性的,但有望为许多公众负载提供改进的性能,尤其是那些有大量更新的工作负载。

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

    关注

    13

    文章

    3959

    浏览量

    84961
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1332

    浏览量

    113943
收藏 人收藏

    评论

    相关推荐

    Mysql索引是什么东西?索引有哪些特性索引是如何工作的?

    作为开发人员,碰到了执行时间较长的 sql 时,基本上大家都会说” 加个索引吧”。但是索引是什么东西,索引有哪些特性,下面和大家简单讨论一下。
    的头像 发表于 12-24 16:20 580次阅读
    Mysql<b class='flag-5'>索引</b>是什么东西?<b class='flag-5'>索引</b>有哪些<b class='flag-5'>特性</b>?<b class='flag-5'>索引</b>是如何工作的?

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

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

    盘点一下PostgreSQL的几种常用脱敏方式

    PostgreSQL Anonymizer 实现动态脱敏的方式是通过将定义某个角色为 "MASKED" 以及脱敏规则。被授予 "MASKED" 角色的用户将无法访问原始数据,而其他角色仍然可以访问。它现已支持多种的脱敏语法,你甚至可以编写自己的规则。
    的头像 发表于 12-05 09:59 305次阅读
    盘点一下<b class='flag-5'>PostgreSQL</b>的几种常用脱敏方式

    Format函数可以传递负索引

    是的, format() 函数可以传递负索引。在使用 format() 函数进行字符串格式化时,可以使用索引来指定要替换的参数位置。正索引从0开始,负索引从-1开始,表示相对于参数列表
    的头像 发表于 11-22 09:45 256次阅读

    浅谈膨胀阀结构和工作原理

    热力膨胀阀的种类:热力膨胀阀按照平衡方式不同,分内平衡式和外平衡式;外平衡式热力膨胀阀分F型和H型两种结构型式。
    发表于 11-13 11:39 1156次阅读
    浅谈<b class='flag-5'>膨胀</b>阀结构和工作原理

    索引的底层实现详解

    说一说索引的底层实现? Hash索引 基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hashcode),并且Hash
    的头像 发表于 10-09 10:26 571次阅读
    <b class='flag-5'>索引</b>的底层实现详解

    索引是什么意思 优缺点有哪些

    1. 索引是什么? 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。数据库
    的头像 发表于 10-09 10:19 1884次阅读

    MySQL索引的常用知识点

    索引结构:B+树 索引其实是一种数据结构 注意B+树是MySQL,索引默认的结构;一张表至少有一个索引(主键索引),是可以有多个
    的头像 发表于 09-30 16:43 293次阅读

    为什么选择 PostgreSQL

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

    PostgreSQL中可用的各种数据类型

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

    PostgreSQL准确且快速的数据对比方法

    MySQL、SQL Server、PostgreSQL、Redis、MongoDB、ClickHouse、Doris 等,可进行数据库间的结构对比和数据对比。
    的头像 发表于 09-12 15:46 534次阅读
    <b class='flag-5'>PostgreSQL</b>准确且快速的数据对比方法

    膨胀阀工作可以应用伺服的哪些运动模式?

    膨胀阀工作时,可以应用伺服电机的以下几种运动模式: (1)位置控制:通过伺服电机的位置控制功能,可以精确地控制膨胀阀的开度。根据系统需求,可以设定目标位置,并使用闭环反馈控制来实现准确的位置控制
    的头像 发表于 08-25 08:35 279次阅读
    <b class='flag-5'>膨胀</b>阀工作可以应用伺服的哪些运动模式?

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

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

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

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

    MySQL为什么选择B+树作为索引结构?

    在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B+树作为索引
    的头像 发表于 07-20 11:28 592次阅读
    MySQL为什么选择B+树作为<b class='flag-5'>索引</b>结构?