PostgreSQL中HOT对cluster的作用

PG中cluster的作用是根据表的索引重新构建一张表,并且表根据该索引进行排序,索引必须提前建好。
注意:cluster操作加ACCESS EXCLUSIVE锁,会阻塞其它任何操作。

我们为什么要运行cluster?

PG中的表是堆表,表中行的顺序可能是乱的,为了加快SQL的查询速度,我们一般会建一个Btree索引,但是如下图所示,可能会造成IO放大,因为要从不同的数据块中取数据,扫描更多的块。
在这里插入图片描述
如何提高范围扫描的效率呢?这里我们就可以考虑使用cluster命令,按索引顺序排列行,这样范围扫描的效率就会高很多,如下,同样扫描三行,只需要扫描一个块。
在这里插入图片描述
显然,一个表只能有一个物理排序,因此只能在表上的一个索引上加速范围扫描。但是,如果两个索引共享前导列,那么将表聚类到其中一个索引上也会在一定程度上加快对另一个索引的范围扫描。

ANALYZE为每列收集的统计数据的时候,列值与行的物理顺序之间也存在相关性。这是一个介于-1和1之间的数。如果相关性为1,则按值的升序排列行。如果相关性为-1,则按值降序对表进行物理排序。在0附近的相关性意味着物理顺序和逻辑顺序之间没有联系。PostgreSQL优化器使用这种相关性来估计索引范围扫描的成本。

cluster的一些缺点

CLUSTER背后的代码与VACUUM (FULL)相同,只是增加了一个排序。因此,CLUSTER存在和VACUUM (FULL)一样的问题:

  • CLUSTER以ACCESS EXCLUSIVE模式锁定表,锁定期间阻塞所有操作
  • 需要二倍于表的空间进行操作

此外,CLUSTER建立的顺序不会持续保持:随后的insert和update不会遵守这个顺序,并且相关性会随着时间的推移而“失效”。因此,如果希望索引范围扫描保持快速,就必须定期对表进行cluster操作。

HOT updates可以保持cluster顺序

DELETE不会破坏行顺序,但是也无法阻止insert打乱相关性。然而,PostgreSQL有一个特性可以防止UPDATE破坏表顺序:HOT更新。
HOT更新将新版本的行放在与旧版本相同的8kB块中,并且它不修改任何索引列,因此它极小干扰索引列的相关性。因此,在HOT更新之后,索引列上的索引范围扫描将保持高效!

如前所述,HOT可以在更新期间保持相关性,但它根本不能帮助INSERT。此外,必须将填充因子设置为低于100才能获得大多数HOT更新,这会人为地使表膨胀。因此,它减慢了顺序扫描并降低了缓存的效率。

下面通过实际例子看下效果:

#创建表,然后设置不同的fillfactor进行测试
CREATE UNLOGGED TABLE clu (id  bigint  NOT NULL,key integer NOT NULL,val integer NOT NULL
) WITH (autovacuum_vacuum_cost_delay = 0,fillfactor = ???
);

然后尝试不同的填充因子。我将使用pgbench对表进行更新,因此我将autovacuum调整为尽快执行,以便它能够应付工作负载。

插入数据,创建索引,收集统计信息

INSERT INTO clu (id, key, val)
SELECT i, hashint4(i), 0
FROM generate_series(1, 10000000) AS i;#创建索引
CREATE INDEX clu_idx ON clu(key);
CLUSTER clu USING clu_idx;#收集统计信息
ALTER TABLE clu ADD PRIMARY KEY (id);/* set hint bits and gather statistics */
VACUUM (ANALYZE) clu;

使用pgbench进行测试

\set i random(1, 10000000)
UPDATE clu SET val = val + 1 WHERE id = :i;#6个client,更新60 million次
pgbench --random-seed=42 --no-vacuum --file=updates --transactions=10000000 --client=6

然后查看相关性,以及有多少HOT更新,以及autovacuum是否被触发

ANALYZE clu;
SELECT correlation
FROM pg_stats
WHERE tablename = 'clu' AND attname = 'key';SELECT n_tup_hot_upd, autovacuum_count
FROM pg_stat_user_tables
WHERE relname = 'clu';

只要所有的更新都是HOT,再降低填充系数就没什么不同了。

查看一下表膨胀了多少

SELECT pg_size_pretty(pg_table_size('clu')) AS tab_size,pg_size_pretty(pg_total_relation_size('clu')- pg_table_size('clu')) AS ind_size;

在PostgreSQL 15.2中进行不同的fillfactor设置,进行测试后,表和索引膨胀是相对于使用默认填充因子新创建的表和索引的大小来测量的(表占用422 MB,两个索引总共占用428 MB)。
在这里插入图片描述

总结:
如果一个表没有insert操作,那么我们可以设置fillfactor,以便所有或大部分更新都是HOT,那么该表可以在很长的时间内或永远保持在CLUSTER建立的顺序。通过这种方式,我们可以获得快速的索引范围扫描,而不需要或减少定期重新cluster的需要。

参考:
https://www.postgresql.org/docs/current/sql-cluster.html
https://www.cybertec-postgresql.com/en/use-hot-so-cluster-wont-rot-postgresql/
https://dazuiba008.blog.csdn.net/article/details/90749905?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4163.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

青少年机器人技术一级核心知识点:机械结构及模型(四)

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

简述环保用电监管云平台

1、概述 推进打赢蓝天保卫战,打好碧水保卫战,打胜净土保卫战,加快生态环境保护、建设美丽中国,各省市结合物联网和大数据政策,也相继颁布有关污染治理设施用电监管平台等相关政策。针对企业内的环保设施、设备运行状况…

GitHub下载破千万!这份Java大厂面试指南,竟是阿里面试官上传的

前言 本以为在大厂可以逃过35岁的坎儿,结果还没到35就遇上了大裁员。。。被裁的那一个月,我拿着公司给的2N在家躺了大半个月,刚开始是不甘,到后面每个月一万多的房贷催着我不得不重新审视自己,随后踏上了海投之路。 …

【Spring Cloud系列】-Eureka服务端高可用详解

【Spring Cloud系列】-Eureka服务端高可用详解 文章目录 【Spring Cloud系列】-Eureka服务端高可用详解一. 序言二. 什么是高可用性三. 什么是CAP一致性(Consistency)可用性(Availability)分区容错(Partition-toleranc…

Kubernetes-Ingress、Ingress Controller、Ingress Class

概念 1.Ingress 是对K8S集群中服务的外部访问进行管理的 API 对象。Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。 2.Ingress Controller 通常负责通过负载均衡器来实现 Ingress。 3.必须拥有一个 Ingress Controller…

vue(typescript)项目在vs中打开出现的各种问题

目录 vue3 报错解决:找不到模块或其相应的类型声明。(Vue 3 can not find module) (TS) 未知的编译器选项“allowImportingTsExtensions”。 TS6046 (TS) “--moduleResolution”选项的参数必须为 node, classic, node16, nodenext。…

使用 Sigstore 签名的 Elastic Stack 容器镜像!

作者:Maxime Greau 软件供应链攻击不断增加。 这就是为什么这个主题是安全领导者的首要任务。 在这方面,这篇博文重点介绍了使用 Sigstore 对 Elastic Stack 容器镜像进行签名的新功能,以便: 保护 Elastic 软件供应链工作流程为…

6月份读书学习好文记录

看看CHATGPT在最近几个月的发展趋势 https://blog.csdn.net/csdnnews/article/details/130878125?spm1000.2115.3001.5927 这是属于 AI 开发者的好时代,有什么理由不多去做一些尝试呢。 北大教授陈钟谈 AI 未来:逼近 AGI、融进元宇宙,开源…

Nginx(4)nginx的反向代理

反向代理 正向代理反向代理的常用指令反向代理实战 Nginx的安全控制使用SSL对流量进行加密nginx添加SSL的支持Nginx的SSL相关指令生成证书 反向代理系统调优 正向代理代理的对象是客户端,反向代理代理的是服务端,这是两者之间最大的区别。Nginx即可以实现…

Java应用在线debug--bistoury介绍

Bistoury介绍 Bistoury 是去哪儿网开源的一个对应用透明,无侵入的java应用诊断工具,用于提升开发人员的诊断效率和能力,可以让开发人员无需登录机器或修改系统,就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面…

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

文章目录 1. 实验节点规划表2. 安装Prometheus3. 安装node_exporter4. 配置prometheus.yml文件5. 安装Grafana6. 安装Altermanager监控告警 采用 "PrometheusGrafana"的开源监控系统,安装部署K8S集群监控平台。 并使用Altermanager告警插件,配…

CentOS Linux的替代品(四)_openEuler 22.03-LTS基础安装教程

文章目录 1 openEuler 22.03-LTS简介1.1 系统安装1.1.1 发布件1.1.2 最小硬件要求1.1.3 硬件兼容性 1.2 关键特性1.2.1 openEuler 22.03-LTS基于 Linux Kernel 5.10内核构建, 在进程调度、内存管理等方面带来10余处创新1.2.2 新介质文件系统1.2.3 内存分级扩展1.2.4 用户态协议…