PostgreSQL 触发器性能评估实战(pg_stat_user_functions)
在 PostgreSQL 中如果表上有行级触发器FOR EACH ROW每一行数据变更都会执行一次触发器函数。在高写入业务场景下触发器可能成为性能瓶颈。本文介绍一种线上无侵入评估触发器性能的方法。核心思路是使用 PostgreSQL 的系统统计视图pg_stat_user_functions该视图可以统计函数调用次数累计执行时间平均执行时间官方文档https://www.postgresql.org/docs/current/monitoring-stats.html一、查询触发器函数执行统计执行 SQLSELECT funcname, calls, total_time, self_time, round((total_time / NULLIF(calls, 0))::numeric, 3) AS avg_ms FROM pg_stat_user_functions;示例结果业务表名已脱敏funcname | calls | total_time | self_time | avg_ms ------------------------------------------------------------------------------------- update_table_a*****t_timestamp | 9561025 | 504633.213 | 504633.213 | 0.053 update_table_s*********t_timestamp | 2470 | 2383.109 | 2383.109 | 0.965 update_table_a**********e_timestamp | 17164847 | 494839.288 | 494839.288 | 0.029 update_table_a************n_timestamp | 156261209 | 7043454.101 | 7043454.101 | 0.045 update_table_r******y_timestamp | 13777786 | 434085.728 | 434085.728 | 0.032 update_table_o****_timestamp | 28065270 | 1024514.247 | 1024514.247 | 0.037 update_table_o*************c_timestamp | 12346101 | 345943.599 | 345943.599 | 0.028 (7 rows)字段说明字段含义funcname函数名calls函数调用次数total_time累计执行时间毫秒self_time函数自身执行时间avg_ms单次平均耗时注意round(double precision, integer)在 PostgreSQL 中不存在因此需要::numeric进行类型转换。二、如何解读这些数据先看一个典型函数update_t*******r_timestamp统计calls 28065270 total_time 1024514 ms avg_ms 0.037 ms说明函数被调用2806 万次累计执行时间约 1024 秒平均每次执行0.037 ms也就是说1000 次触发器执行 ≈ 37 ms 100000 次触发器执行 ≈ 3.7 秒如果某个 UPDATE 语句影响10 万行触发器本身就可能消耗100000 × 0.037ms ≈ 3.7 秒这就是行级触发器在批量更新场景的典型性能特征。三、最值得关注的触发器最值得关注的是update_t***************n_timestamp统计calls 156261209 total_time 7043454 ms avg_ms 0.045 ms换算一下total_time ≈ 7043 秒 ≈ 1.96 小时说明该触发器累计 CPU 时间已经接近2 小时。虽然单次执行只有0.045 ms但是因为调用次数巨大1.56 亿次累计开销非常明显。这是典型的单次开销很小但调用次数巨大导致总成本很高。四、为什么触发器调用次数这么多因为 PostgreSQL行级触发器是按行执行的。例如UPDATE table SET statuspaid WHERE create_time now() - interval 7 days;如果更新50 万行触发器执行次数 50 万次如果业务系统每天有大量批量 UPDATE就会产生非常高的触发器调用量。PostgreSQL 官方文档也明确说明Row-level triggers fire once for each row affected by the triggering statement.https://www.postgresql.org/docs/current/sql-createtrigger.html五、如何判断触发器是否成为性能瓶颈一般可以参考三个指标1 调用次数如果calls 1亿基本可以确定触发器参与了大量业务写入。2 平均执行时间经验值avg_ms评价 0.05 ms很轻0.05 ~ 0.2 ms正常 0.5 ms偏重 1 ms需要优化例如update_t**************t_timestamp avg_ms 0.965接近1 ms已经算比较重的触发器。3 总执行时间如果total_time 1000000 ms说明该触发器已经消耗 1000 秒 CPU需要重点关注。六、典型触发器逻辑示例很多系统会用触发器维护更新时间例如updated_at示例逻辑BEFORE UPDATE IF NEW.col IS DISTINCT FROM OLD.col THEN NEW.updated_at now()这种触发器在 OLTP 系统中非常常见但需要注意行级触发高频调用批量 UPDATE 成本放大七、线上评估触发器性能的最佳实践推荐步骤1 开启函数统计track_functions pl2 查看统计pg_stat_user_functions3 找出高调用函数按 calls 排序。4 找出高耗时函数按 total_time 排序。5 分析 SQL结合pg_stat_statements确认哪些 UPDATE 导致触发器大量执行。八、总结通过 pg_stat_user_functions 可以快速评估触发器性能核心指标callstotal_timeavg_ms经验结论1️⃣ 行级触发器性能成本与更新行数线性相关2️⃣ 单次触发器通常很轻但高调用量会产生巨大累计成本3️⃣ pg_stat_user_functions 是线上分析触发器性能的最佳工具之一

相关新闻

阿里云服务器AlibabaCloudLinux3 配置环境

阿里云服务器AlibabaCloudLinux3 配置环境

一、nginx安装与配置 ## 执行: sudo yum -y install nginx ## 执行成功后,运行下面命令查看nginx版本号 nginx -v ## 安装成功则返回类似下面的信息: #: nginx version: nginx/1.20.1 ## 安装目录:/etc/nginx ## html …

2026/7/2 23:48:04 阅读更多 →
基于 Ollama + Qwen3.5 + OpenClawbot 的本地 RAG,接入企业微信 / 飞书(实战篇)

基于 Ollama + Qwen3.5 + OpenClawbot 的本地 RAG,接入企业微信 / 飞书(实战篇)

一、整体思路:RAG 不动,只在“入口”加 IM 通道 你现在已经有这一条链路: 终端/TUI → OpenClawbot → Ollama(http://localhost:11434) → Qwen3.5 │ └…

2026/7/2 23:46:58 阅读更多 →
嵌入式软件第三方测试全攻略:技术要点、合规标准与选型实战(2026 版)

嵌入式软件第三方测试全攻略:技术要点、合规标准与选型实战(2026 版)

引言 嵌入式软件作为工业控制、汽车电子、医疗设备、智能家居等领域的核心载体,其实时性、可靠性、安全性直接决定产品成败。相较于通用软件,嵌入式软件兼具 “硬软强耦合”“运行环境严苛”“行业合规要求高” 的特点,仅靠内部研发自测&…

2026/5/17 11:56:36 阅读更多 →

最新新闻

App Store迎来一轮重要更新:商店页、订阅和推荐都变了

App Store迎来一轮重要更新:商店页、订阅和推荐都变了

近期,苹果发布了一批围绕 App Store 的新能力,重点涉及商店页素材、订阅商业化、游戏曝光等方向。官方对这些功能的介绍较为简短。放到具体使用场景里看,这批更新主要在补强 App Store 的几个关键环节:产品如何展示、素材如何管理…

2026/7/2 23:47:54 阅读更多 →
PIC18F56K42与DS28EC20的1-Wire EEPROM存储方案详解

PIC18F56K42与DS28EC20的1-Wire EEPROM存储方案详解

1. 项目背景与核心需求在嵌入式系统开发中,用户设置和偏好的持久化存储是一个常见但关键的需求。无论是家电控制面板的亮度调节、工业设备的参数配置,还是消费电子产品的个性化选项,都需要一种可靠的非易失性存储方案。传统方案如Flash存储存…

2026/7/2 23:45:54 阅读更多 →
jquery.i18n.properties前端国际化解决方案“填坑日记”

jquery.i18n.properties前端国际化解决方案“填坑日记”

、jquery.i18n.properties通用解决方案 关于jquery.i18n.properties的使用,网上资料很多,比较完整的使用可以参考 这篇 ,有比较详细的使用说明。这里博主简单概述下过程。 回到顶部 1、需要引用的js文件 先在你的项目文件里面添加如下目录…

2026/7/2 23:41:52 阅读更多 →
8051单片机+Proteus仿真SHT11温湿度采集完整工程(含C51源码、.hex烧录文件与RS485扩展文档)

8051单片机+Proteus仿真SHT11温湿度采集完整工程(含C51源码、.hex烧录文件与RS485扩展文档)

本文还有配套的精品资源,点击获取 简介:一套开箱即用的8051温湿度采集仿真开发包,基于SHT11数字传感器,完整集成Keil C51工程与Proteus电路图(湿度控制.DSN)。内含带中文注释的核心驱动文件SHT-OWNI-1.3…

2026/7/2 23:39:51 阅读更多 →
Wagtail CMS安全实战:从漏洞扫描到自动化防护的完整指南

Wagtail CMS安全实战:从漏洞扫描到自动化防护的完整指南

1. 项目概述:为什么Wagtail也需要安全扫描?如果你正在使用Wagtail构建内容管理系统,或者负责维护一个基于Wagtail的网站,你可能会觉得它已经足够安全了。毕竟,作为一个基于Django的现代化CMS,Wagtail在开发…

2026/7/2 23:39:51 阅读更多 →
CLONEit 评测以及如何使用CLONEit 轻松传输数据

CLONEit 评测以及如何使用CLONEit 轻松传输数据

如今,手机间传输工具比以往任何时候都更受欢迎,尤其是在升级新设备时。虽然有很多方法可以实现这一点,但 CLONEit 凭借其简单高效而脱颖而出,成为备受欢迎的选择。然而,与任何工具一样,它也有其优缺点。在本…

2026/7/2 23:35:49 阅读更多 →

日新闻

Path of Building PoE2:5步掌握流放之路2角色构建的终极免费工具

Path of Building PoE2:5步掌握流放之路2角色构建的终极免费工具

Path of Building PoE2:5步掌握流放之路2角色构建的终极免费工具 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 还在为《流放之路2》复杂的角色构建而头疼吗?面对上千个天赋节点…

2026/7/2 19:10:19 阅读更多 →
SSH密钥生成原理与跨平台安全实践指南

SSH密钥生成原理与跨平台安全实践指南

1. 为什么今天还必须亲手生成 SSH 密钥——不是“过时操作”,而是安全基建的起点你可能已经点开过几十次 GitHub 的 SSH 设置页,也见过终端里一闪而过的ssh-keygen -t ed25519 -C "your_emailexample.com"命令,但真正理解它在 macO…

2026/7/2 19:10:19 阅读更多 →
GAN工程化实战:从图像合成到物理建模的工业落地路径

GAN工程化实战:从图像合成到物理建模的工业落地路径

1. 项目概述:当GAN不再只是“画图玩具”,它正在悄悄重构现实世界的生产逻辑“Astonishing GAN Applications”——这个标题乍看像科技展会的宣传语,但在我过去三年深度参与17个GAN落地项目的实操经验里,它根本不是修辞&#xff0c…

2026/7/2 19:12:20 阅读更多 →

周新闻

月新闻