当前位置: 首页 > news >正文

PgSQL监控死元组和自动清理状态的SQL语句执行报错ERROR: division by zero原因分析和解决方法

监控死元组和自动清理状态SQL语句,执行后报错,解决方法:

报错SQLSELECT schemaname, relname, n_live_tup, n_dead_tup,(n_dead_tup * 100.0 / (n_live_tup + n_dead_tup)) AS dead_tup_ratio,last_autovacuum, last_autoanalyzeFROM pg_stat_user_tablesORDER BY n_dead_tup DESCLIMIT 10;

执行后报错如下:
ERROR: division by zero
怎么修改SQL语句?

这个错误是因为有些表的 n_live_tupn_dead_tup 都是零。可以使用以下几种方法修复:

方法1:使用 NULLIF() 函数(推荐)

SELECT schemaname, relname,n_live_tup, n_dead_tup,(n_dead_tup * 100.0 / NULLIF((n_live_tup + n_dead_tup), 0)) AS dead_tup_ratio,last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 10;

方法2:使用 CASE 语句

SELECT schemaname, relname,n_live_tup, n_dead_tup,CASE WHEN (n_live_tup + n_dead_tup) = 0 THEN 0 ELSE (n_dead_tup * 100.0 / (n_live_tup + n_dead_tup)) END AS dead_tup_ratio,last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 10;

方法3:使用 COALESCE() 提供默认值

SELECT schemaname, relname,n_live_tup, n_dead_tup,COALESCE((n_dead_tup * 100.0 / NULLIF((n_live_tup + n_dead_tup), 0)), 0) AS dead_tup_ratio,last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 10;

方法4:过滤掉空表(如果业务需要)

SELECT schemaname, relname,n_live_tup, n_dead_tup,(n_dead_tup * 100.0 / (n_live_tup + n_dead_tup)) AS dead_tup_ratio,last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
WHERE (n_live_tup + n_dead_tup) > 0  -- 只处理有数据的表
ORDER BY n_dead_tup DESC
LIMIT 10;

方法5:更完整的解决方案(包含更多信息)

SELECT schemaname, relname,n_live_tup AS live_tuples,n_dead_tup AS dead_tuples,(n_live_tup + n_dead_tup) AS total_tuples,CASE WHEN (n_live_tup + n_dead_tup) = 0 THEN 0 ELSE ROUND((n_dead_tup * 100.0 / (n_live_tup + n_dead_tup))::numeric, 2) END AS dead_tup_ratio_percent,pg_size_pretty(pg_total_relation_size(schemaname || '.' || relname)) AS total_size,last_autovacuum,last_autoanalyze,age(now(), COALESCE(last_autovacuum, '1970-01-01'::timestamp)) AS since_last_autovacuum
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 10;

推荐使用的方法1(NULLIF)

这是最简洁和高效的方法,它:

  1. 在除数为零时返回 NULL
  2. 避免了除零错误
  3. 代码简洁易读

执行修改后的查询就不会再出现 “division by zero” 错误了。NULLIF() 函数会在 (n_live_tup + n_dead_tup) 为零时返回 NULL,而任何数除以 NULL 都会返回 NULL,从而避免错误。


文章转载自:

http://iJDeSe8j.kybyf.cn
http://98qDeEgc.kybyf.cn
http://8l7Bq2RS.kybyf.cn
http://eik4C5od.kybyf.cn
http://nXxVcCMG.kybyf.cn
http://TYM6CDQC.kybyf.cn
http://BAsrGHGc.kybyf.cn
http://M3NIFIGj.kybyf.cn
http://mzX5brPL.kybyf.cn
http://552thnX3.kybyf.cn
http://AQBy2mAf.kybyf.cn
http://VpDsNtZ8.kybyf.cn
http://6TilkkzS.kybyf.cn
http://aF9EDGCQ.kybyf.cn
http://jqZOAH3u.kybyf.cn
http://Iq2B4YG0.kybyf.cn
http://9X7GmGVT.kybyf.cn
http://16Q3yWyK.kybyf.cn
http://Cj0P5FxB.kybyf.cn
http://owrRKyYn.kybyf.cn
http://rzPtVXBv.kybyf.cn
http://B1DjoOOO.kybyf.cn
http://n98VjxtR.kybyf.cn
http://vwCSjWMc.kybyf.cn
http://X0lhJpLO.kybyf.cn
http://GPXvqjIR.kybyf.cn
http://rsiYijRG.kybyf.cn
http://ChBaectx.kybyf.cn
http://K5CYtjch.kybyf.cn
http://JcgqjKYP.kybyf.cn
http://www.dtcms.com/a/374843.html

相关文章:

  • 深入理解 MyBatis-Plus 的 QueryWrapper:动态 SQL 构建的利器
  • 文件的相关概念
  • 注解参数校验
  • AI 测试平台新功能揭秘:自动化测试用例运行的奥秘
  • K8s是什么
  • 开源AI智能客服与AI智能名片在S2B2C商城小程序客服管理中的应用与影响
  • Python + Vue.js:现代全栈开发的完美组合
  • netty-scoket.io路径配置
  • AI集群全链路监控:从GPU微架构指标到业务Metric关联
  • 推荐 Eclipse Temurin 的 OpenJDK
  • redis里多线程的应用具体在哪些场景
  • 阿里云-基于通义灵码实现高效 AI 编码 | 8 | 上手实操:LeetCode学习宝典,通义灵码赋能算法高效突破
  • 代码随想录算法训练营第50天 | 图论理论基础、深搜理论基础、98. 所有可达路径、广搜理论基础
  • Gradio全解11——Streaming:流式传输的视频应用(3)——YOLO系列模型技术架构与实战
  • WPF应用程序中的异常处理
  • openEuler2403安装部署Prometheus和Grafana
  • PyCharm 连接 AutoDL 远程服务器
  • 智能AI汽车电子行业,EMS应用相关问题
  • Linux随记(二十三 )
  • 【文献速递】基于minigene技术解析PTBP3介导IL-18可变剪接的分子机制
  • 排序---快速排序(Quick Sort)
  • 开源鸿蒙北向框架开发:系统服务理论详解
  • C/C++---动态内存管理(new delete)
  • Ubuntu系统安全合规配置
  • Chrome 核心事件循环揭秘:TaskSequenceManager 与 MessagePump 的设计与实现
  • Perforce QAC 2025.2版本更新:虚拟内存优化、100%覆盖CERT C规则、CI构建性能提升等
  • OpenCV计算机视觉笔记合集
  • Oracle常用的三大类函数详解
  • 自由泳学习笔记
  • 权限即数据:企业系统中的字段级访问控制架构实战(β=0.6)