为什么我在 PostgreSQL 中 Commit 很慢?

在这里插入图片描述
有时,我们的一位客户会查看数据库中最耗时的语句(使用pg_stat_statements或pgBadger),并发现COMMIT排名靠前。通常,COMMIT这是 PostgreSQL 中非常快的语句,因此值得研究。在本文中,我将探讨速度缓慢的可能原因COMMIT并讨论您可以采取的措施。
#PG培训#PG考试#postgresql培训#postgresql考试#postgresql认证
在这里插入图片描述

Commit PostgreSQL中的基本活动

缓慢COMMIT是一个令人惊讶的观察结果,因为在 PostgreSQL 中提交事务是一个非常简单的活动。在大多数情况下,COMMIT只需

  • 将提交日志中事务的两位设置为TRANSACTION_STATUS_COMMITTED(0b01) (持久保存pg_xact)
  • 如果track_commit_timestamp设置为on,则记录提交时间戳(保留在 中pg_commit_ts)
  • 将预写日志(WAL)(保存在)刷新pg_wal到磁盘,除非synchronous_commit设置为off

请注意,由于 PostgreSQL 的多版本架构,和通常COMMIT都是ROLLBACK非常快的操作:它们都不需要触及表,它们仅在提交日志中注册事务的状态。

最常见的速度慢原因Commit:磁盘问题

从上面可以看出,导致速度缓慢的一个潜在原因是磁盘 I/O。毕竟,将 WAL 刷新到磁盘会导致 I/O 请求。因此,您应该检查的第一件事是磁盘是否有问题或负载过大:

  • 在 Linux 上,您可以使用“ vmstat 1”或“ sar -p 1”等命令来测量等待 I/O 所花费的 CPU 时间百分比(“wa”vmstat和“ %iowait” sar)。如果该值持续高于 10,则可以肯定 I/O 系统处于压力之下。

  • 使用NAS时,您应该检查 TCP 网络是否过载。

  • 如果存储是共享SAN或NAS,则磁盘可能会与其他机器共享,您应该检查存储系统是否存在争用。

  • 磁盘故障、其他硬件问题或操作系统问题可能会导致间歇性性能问题。检查内核日志以获取消息。

如果我们可以排除磁盘问题是导致提交缓慢的原因,我们就必须进行进一步调查。

阅读源代码以了解更多信息

如果我们想了解事务提交期间发生了什么,最简单的方法就是阅读源代码。许多人没有意识到开源的真正威力:你不必猜测或从软件供应商那里购买支持,而是可以自己查看。PostgreSQL 源代码写得很好,文档齐全,许多部分不需要专家 C 技能即可理解。相关代码位于CommitTransaction()中的函数中src/backend/access/transam/xact.c。

在特殊情况下,导致速度变慢的原因有多种COMMIT,例如许多并发NOTIFY语句的争用(您可以从 中的数据库 0 上的锁来诊断这种情况pg_locks)。但是,通常罪魁祸首是以下部分中描述的三种情况之一。

Commit由于延迟约束和触发器导致速度缓慢

通常,PostgreSQL 会在修改受约束表的语句中检查约束。使用延迟约束时,PostgreSQL 会等待检查,直到事务结束。一个用例是,如果您将数据插入具有循环外键约束的表中:

CREATE TABLE department (
   department_id bigint PRIMARY KEY,
   name text NOT NULL,
   manager bigint NOT NULL
);
 
CREATE TABLE employee (
   employee_id bigint PRIMARY KEY,
   name text NOT NULL,
   department_id bigint
      REFERENCES department NOT NULL
);
 
-- deferred foreign key
ALTER TABLE department
   ADD FOREIGN KEY (manager) REFERENCES employee
      DEFERRABLE INITIALLY DEFERRED;

延迟外键可以轻松创建新的部门:


START TRANSACTION;
 
-- won't raise a foreign key violation yet
INSERT INTO department
   (department_id, name, manager)
VALUES (12, 'Flower Picking', 123);
 
INSERT INTO employee
   (employee_id, name, department_id)
VALUES (123, 'John Wurzelrupfer', 12);
 
-- deferred constraint is valid now
COMMIT;

由于 PostgreSQL 在提交时检查延迟约束,因此它们可能会减慢COMMIT处理速度。通常,检查约束非常快 — 这是索引查找。但是,许多此类检查可能会累积在较大的事务中,并且总执行时间可能会大大减慢COMMIT。

PostgreSQL 还具有可延迟的约束触发器COMMIT,并且像延迟约束一样会减慢速度。有关约束触发器用例的进一步讨论,请参阅本文。

如果您能确定延迟约束或触发器是导致 缓慢的原因COMMIT,那么可能就没问题了,无需担心。毕竟,您必须在某个时候检查这些约束。

Commit游标导致速度慢With Hold

游标允许客户端分块提取查询结果集,这可以简化处理并避免客户端内存不足。但是,常规游标只能存在于数据库事务的上下文中。因此,在涉及用户交互时不能使用游标:游标持有的快照会阻碍进程VACUUM并导致表膨胀和更严重的问题。此外,ACCESS SHARE在事务期间持有的锁会导致并发ALTER TABLE或问题TRUNCATE。

为了避免与事务绑定的限制,您可以使用游标WITH HOLD。此类游标可以比创建它的事务存活更久,例如可用于实现分页。PostgreSQL 通过在提交时具体化结果集来实现WITH HOLD游标。如果游标后面的查询很昂贵,那么速度会变得非常慢。此外,您一定不要忘记在完成后关闭此类游标,否则具体化结果集将占用服务器资源,直到数据库会话结束。COMMIT

如果您可以将游标确定WITH HOLD为提交缓慢的原因,则可以通过调整游标定义中的查询以使其运行得更快来改善这种情况。由于 PostgreSQL 不会优化游标中的查询以加快计算完整结果集的速度,因此有时将其设置cursor_tuple_fraction为 1.0 可以帮助加快提交处理速度。

Commit同步复制导致速度慢

流式复制和逻辑复制默认都是异步的。如果您使用复制来实现高可用性,并且不想冒丢失已提交事务的风险,则可以使用同步复制。使用同步复制时,提交时的操作顺序为:

将COMMIT记录写入WAL并刷新(这是实际的持久提交)

等待同步备用数据库报告已获取所有WAL信息

使事务在主服务器上可见

向客户报告成功

如果主服务器和同步备用服务器之间的网络延迟较高,COMMIT则需要很长时间。您可以通过检查pg_stat_activity频繁或持续时间较长的“ SyncRep”等待事件来诊断。通常,您只想在网络延迟较低的机器(即物理上靠近的机器)之间使用同步复制。

Commit第三方扩展导致速度缓慢

PostgreSQL 最出色的特性之一是其可扩展性。它允许您编写与 PostgreSQL 核心交互的扩展,而无需修改服务器代码。第三方代码可以“挂接”到 PostgreSQL 中以修改其行为。在许多其他选项中,您可以使用 C 函数RegisterXactCallback()注册 PostgreSQL 在提交时执行的回调。因此,如果您要查找 PostgreSQL 速度缓慢的原因COMMIT,还应该查看数据库中安装的扩展。例如,在远程数据源实现事务处理的外部数据包装器可能希望在 PostgreSQL 提交本地事务时提交远程事务。那么,远程端的高网络延迟或缓慢的事务处理将减慢 PostgreSQL 的速度COMMIT。

结论

查看源代码,我们可以轻松找到导致速度慢的可能原因COMMIT:除了磁盘问题的明显原因之外,还应该将延迟约束、游标WITH HOLD和同步复制视为可能的原因。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四川赤橙宏海商务信息咨询有限公司可信吗?

在数字化浪潮席卷全球的今天,电商行业正以前所未有的速度蓬勃发展。作为这一领域的佼佼者,四川赤橙宏海商务信息咨询有限公司凭借其在抖音电商服务领域的深厚积累和卓越表现,成为了引领行业创新发展的重要力量。 四川赤橙宏海商务信息咨询有…

华为设备telnet 远程访问配置实验简述

一、实验需求: 1、AR1模拟电脑telnet 访问AR2路由器。 二、实验步骤: 1、AR1和AR2接口配置IP,实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户telnet 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录…

如何使用DeadFinder寻找失效链接

关于DeadFinder DeadFinder是一款功能强大的链接分析工具,该工具可以帮助广大研究人员快速地寻找目标页面中的无效链接(死链)。所谓死链,即一个页面中存在的无法被连接的一条链接。这些链接如果一直保留在页面中的话,…

【2024.6.21】今日科技时事:科技前沿大事件

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

[STM32]万年历

[STM32]万年历 需要资料的请在文章末尾获取~ ​​ 01描述 使用原件:stm32f103c8t6最小系统板x1,0.96寸OLED显示屏四角x1,4x4矩阵按键x1; 键位对应图: 1, 2, 3, 4------------- 切换页面 设置…

干货分享|如何将前端代理服务器(BFF)接入身份认证(1)

本篇文章将通过实例来详细讲解如何将前端代理服务器(BFF)接入身份认证。我们将使用一个示例应用来演示 BFF 与身份认证的集成过程。 通过这些实例讲解,你将掌握 BFF 与身份认证的集成技巧,为你的前端应用提供安全可靠的认证机制。…

APP IOS

APP IOS苹果源生应用程序 APP Android-CSDN博客

【Sa-Token|3】Sa-Token集成到现有微服务详细介绍

一、系统架构调整 用户中心:保持现有的用户登录、注册接口不变。多个项目:前后端分离,保持现有逻辑不变。网关服务:新增或配置网关服务,处理所有请求并进行 Token 校验和转发。统一 Token 管理:通过 Sa-Tok…

肇庆具有资质等保机构有几家?在哪里?

在近期揭晓的“中国百强城市排行榜”中,广东省共有12个城市入选,其中包括肇庆。肇庆-山水之城,文化之韵,端砚之乡,岭南瑰宝,是一个非常有发展的城市,企业多多。这不不少肇庆企业在问&#xff0c…

嵌入式PID算法总结

参考 CMSIS-DSP PID 控制 学习历程 最开始,根据公式自己写PID算法;后面找资料时,发现wiki上介绍PID时,提供了伪代码,直接照着翻译一下就可用了;然后想要实现一个自己的PID库(能够实现多级PID…

10条提升大模型任务微调效果的tricks

在大型语言模型(LLMs)的研究和应用中,如何通过微调来适应特定任务是一个关键问题。尽管提示工程(PE)在提升LLMs的零样本学习和上下文内学习方面取得了显著成效,但关于如何设计有效的微调样本以进一步提升LL…

Elasticsearch中的Term_Filter过滤器技术

文章目录 一、引言二、Term Filter的工作原理与内部机制三、Term Filter的多样化使用场景3.1 精确匹配3.2 过滤分类与标签3.3 数据范围筛选3.4 复杂查询的构建 四、Term Filter的最佳实践与应用建议4.1 避免使用分析器4.2 优化索引映射4.3 充分利用缓存4.4 持续监控性能 五、结…

Redis 7.x 系列【2】单机部署

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. Windows2. Linux 1. Windows Redis作为一个高性能的内存数据库,和Linu…

查询mysql库表的几个语句

1、查询某个数据库的所有表 SELECTtable_name FROMinformation_schema.TABLES WHEREtable_schema database_namedatabase_name替换成你需要查询的数据库名称 2、查询某张表的所有字段名称 SELECTCOLUMN_NAME,column_comment FROMinformation_schema.COLUMNS WHEREtable…

功能测试 之 单模块测试----购物车模块

1.需求分析 (1)购物车显示 1.若未登录,提示登录,提示文案“购物车内暂时没有商品,登录后将显示您之前加入的商品” 2.若已登录,购物车没有商品,提示去购物。 未登录状态 已登录状态 3.购物车有…

Java图形用户界面设计AWT事件处理

AWT事件处理 前言一、GUI事件处理机制定义使用步骤Swing事件处理机制与AWT的区别 二、GUI中常见事件和事件监听器事件低级事件高级事件 事件监听器AWT事件类的继承关系 三、事件适配器三、示例代码示例示例一示例二 示例三 前言 推荐一个网站给想要了解或者学习人工智能知识的…

kafka的基本模型

kafka官网 线程和线程之间的数据交互 在jvm里不同的线程有自己的栈内存,但彼此之间交互可以在共享的内存中进行,即堆内存,堆内存会将这些消息放到队列中,具体实现jvm见,栈内存各自维护,堆内存大家共享 进…

华为手机怎么找回删除的照片?掌握3个方法,恢复不是梦

由于误删、设备故障、软件更新等原因,我们有时可能会不慎丢失这些宝贵的照片。当面对空空如也的相册时,那种失落感无法言喻。华为手机该怎么找回删除的照片呢?但是,请不要绝望!在科技的帮助下,我们可以采取…

记忆化搜索——AcWing 901. 滑雪

记忆化搜索 定义 记忆化搜索是一种结合了搜索和动态规划思想的方法。它通过将已经计算过的结果存储起来,在后续遇到相同情况时直接返回存储的结果,避免重复计算。 运用情况 当问题可以用递归方式求解,但存在大量重复计算时。一些复杂的组…

Unity核心

回顾 Unity核心学习的主要内容 项目展示 基础知识 认识模型制作流程 2D相关 图片导入设置相关 图片导入概述 参数设置——纹理类型 参数设置——纹理形状 参数设置——高级设置 参数设置——平铺拉伸 参数设置——平台设置(非常重要) Sprite Sprite Edit…