如何快速定位SQL中高频修改的表_使用性能监控视图

云枫姑娘_5506

云枫姑娘_5506

2026-04-13

795人浏览

原创

postgresql中真正反映“谁被改得最多”的是pg_stat_all_tables视图的n_tup_upd和n_tup_del字段,需结合时间维度、过滤系统表、排除autovacuum干扰,并对比n_tup_hot_upd占比以识别真实业务更新压力。

如何快速定位sql中高频修改的表_使用性能监控视图

查 pg_stat_all_tables 看更新最猛的表

PostgreSQL 里真正反映“谁被改得最多”的,是 pg_stat_all_tables 视图里的 n_tup_upd 和 n_tup_del 字段——不是看日志,也不是靠猜。这个视图每行对应一张表,数值累计自上次统计重置(或集群启动),所以必须结合时间维度判断“高频”是否真实发生。

  • n_tup_upd 是 UPDATE 触发的行级更新次数(哪怕只改一个字段也算一次)
  • n_tup_del 是 DELETE 次数,和 UPDATE 常成对出现(比如软删逻辑)
  • 别只盯着绝对值大的表——先用 WHERE schemaname NOT IN ('pg_catalog', 'information_schema') 过滤系统表
  • 如果刚重启过数据库,这些计数器是空的,pg_stat_all_tables 就没参考价值
SELECT schemaname, relname, n_tup_upd + n_tup_del AS total_dml
FROM pg_stat_all_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY total_dml DESC
LIMIT 5;

用 pg_stat_statements 定位具体哪条 SQL 在狂改

pg_stat_statements 才是定位“谁在改、怎么改”的关键。它记录执行过的 SQL 文本及其调用次数、总耗时、扫描行数等——但默认不启用,且需要 superuser 权限开启。

  • 确认已启用:shared_preload_libraries = 'pg_stat_statements' 在 postgresql.conf 中,且重启生效
  • 执行 CREATE EXTENSION pg_stat_statements;(仅需一次)
  • calls 高 + rows 低,大概率是单行 UPDATE/DELETE;rows 高 + calls 低,可能是批量操作
  • 注意:该插件会归一化 SQL(比如把 WHERE id = 123 变成 WHERE id = $1),所以不能直接匹配业务代码中的字面量
SELECT query, calls, rows, shared_blks_hit
FROM pg_stat_statements
WHERE query ILIKE '%UPDATE%' OR query ILIKE '%DELETE%'
ORDER BY calls DESC
LIMIT 3;

警惕 autovacuum 和 HOT 更新干扰判断

高频修改的表,常伴随大量 autovacuum 活动,而 pg_stat_all_tables.n_tup_upd 会把 HOT 更新(Heap-Only Tuples)也计入——这会让“业务修改量”被高估。

  • HOT 更新不产生新 tuple 版本,也不触发 vacuum,但它仍算一次 n_tup_upd
  • 如果某张表 n_tup_upd 很高,但 n_tup_hot_upd 占比超 70%,说明大部分更新是轻量级的、无锁的,实际压力未必大
  • 检查方法:SELECT relname, n_tup_upd, n_tup_hot_upd FROM pg_stat_all_tables WHERE ...
  • autovacuum 自身的 UPDATE(比如清理 toast 表)也会出现在 pg_stat_statements 中,用户名是 autovacuum,可过滤掉

监控窗口要够长,但别等太久才看

修改频率有明显周期性(比如每小时跑一次批处理,或凌晨刷新报表缓存),只看“当前一分钟”的统计容易误判。

  • 建议至少采集 15 分钟以上的 pg_stat_all_tables 差值(用两次 SELECT 结果相减)
  • 如果应用刚上线或配置刚改,前几小时数据波动大,别急着下结论
  • 不要依赖单次查询结果做扩容或分库决策——连续观察 2–3 个业务周期更可靠
  • 某些 ORM(如 Django 的 save())会无差别 UPDATE 全字段,即使只改了一个字段,也会让 n_tup_upd 虚高
实际查的时候,最容易漏掉的是 autovacuum 的噪声和 HOT 更新的占比。这两个数不拉出来对比着看,光盯着 n_tup_upd 排序,很容易把“看起来很忙”的表当成瓶颈。
数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4403

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

911

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1149

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6341

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3163

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6320

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8601

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1170

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1032

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习