[翻译]利用pg_stat_statments分析业务瓶颈

利用pg_stat_statments分析业务瓶颈

1、查看系统负载

如果希望减少整个系统的负载,可以按照总时间来查看您的语句:

select
  (total_exec_time + total_plan_time)::int as total_time,
  total_exec_time::int,
  total_plan_time::int,
  mean_exec_time::int,
  calls,
  query
from
  pg_stat_statements
order by
  total_time desc
limit 50;

返回所有调用中花费时间最多的50个查询。这意味着频繁执行的快查询可能排在不经常执行的慢查询前面。这可能是查询使用最多系统资源的一个很好的方式。

如果您使用的是 Postgres 版本 12(或更早版本),您将无法访问planning time,并且您还需要分别用 total_time 和 mean_time 替换 total_exec_time 和 mean_exec_time。

如果您使用的是 Postgres 版本 13(或更高版本)并注意到您的 total_plan_time 列全为零,您可能需要查看pg_stat_statements.track_planning(默认情况下处于关闭状态)。

2、查看热门查询

如果您的客户抱怨性能太烂,而您的主要目标是加快最慢的查询,您可以同时查看您的热门查询,例如:

select
  (mean_exec_time + mean_plan_time)::int as mean_time,
  mean_exec_time::int,
  mean_plan_time::int,
  calls,
  query
from
  pg_stat_statements
--where
--  userid = 99999
--  and calls > 1
order by
  mean_time desc
limit 50;

这与上面的例子非常相似,关于版本 13 之前和之后的警告是一样的!

在注释掉的 where 子句中,您可以看到用于减少结果干扰的选项。对 userid 进行过滤可以帮助从用户那里移除那些无关紧要的慢速查询。类似地,如果您让人们执行您希望排除的一次性慢速查询,则限制查询执行次数超过最小次数会很方便。

3、减少IO

考虑系统资源使用的另一种方法是考虑缓冲区。缓冲区统计信息对查询优化非常有用,可以通过他们查询整体工作负载。

将所有缓冲区统计信息加在一起,以提供一个非常粗略的“完成工作”的代理:

select
  shared_blks_hit + shared_blks_read + shared_blks_dirtied + shared_blks_written + local_blks_hit + local_blks_read + local_blks_dirtied + local_blks_written + temp_blks_read + temp_blks_written as total_buffers,
  (total_exec_time + total_plan_time)::int as total_time,
  calls,
  shared_blks_hit as sbh,
  shared_blks_read as sbr,
  shared_blks_dirtied as sbd, 
  shared_blks_written as sbw,
  local_blks_hit as lbh,
  local_blks_read as lbr,
  local_blks_dirtied as lbd,
  local_blks_written as lbw,
  temp_blks_read as tbr,
  temp_blks_written as tbr,
  query
from
  pg_stat_statements
order by
  total_buffers desc
limit 50;

您可能希望将这些缓冲区统计信息中的一些与上面的查询混合搭配,例如查看您按总时间排名的每个查询的 total_buffers。

在这种情况下,我更喜欢查看带有块号的列,但是如果您更喜欢以字节为单位查看它们中的任何一个,您可能会喜欢函数pg_size_pretty() — 如果这样做,请记住乘以您的块大小(默认为 8192)。

4、调整JIT设置

从 Postgres 15 开始,pg_stat_statements 中有了JIT编译统计(和 I/O 计时,但那些可以等到另一天)。我看到很多人遇到过早启动 JIT 编译的问题,这对他们的查询和/或工作负载造成了净损害。下面是一个示例查询,我们可以使用它来查看 JIT 编译时间最长的查询(占时间的百分比):

select
  ((jit_generation_time + jit_inlining_time + jit_optimization_time + jit_emission_time)/(total_exec_time + total_plan_time)) as jit_total_time_percent,
  calls,
  jit_functions,
  jit_generation_time,
  jit_inlining_count,
  jit_inlining_time,
  jit_optimization_count,
  jit_optimization_time,
  jit_emission_count,
  jit_emission_time,
  query
from
  pg_stat_statements
order by
  jit_total_time_percent desc
limit 50;

即时编译花费总时间的百分比进行排序。

5、其他常用SQL

最耗IO SQL,单次调用最耗IO SQL TOP 5:

select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time)/calls desc limit 5;

总最耗IO SQL TOP 5:

select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time) desc limit 5;

最耗时 SQL,单次调用最耗时 SQL TOP 5:

select userid::regrole, dbid, query from pg_stat_statements order by mean_time desc limit 5;

总最耗时 SQL TOP 5:

select userid::regrole, dbid, query from pg_stat_statements order by total_time desc limit 5;

响应时间抖动最严重 SQL:

select userid::regrole, dbid, query from pg_stat_statements order by stddev_time desc limit 5;

最耗共享内存 SQL:

select userid::regrole, dbid, query from pg_stat_statements order by (shared_blks_hit+shared_blks_dirtied) desc limit 5;

最耗临时空间 SQL:

select userid::regrole, dbid, query from pg_stat_statements order by temp_blks_written desc limit 5;

原文

https://www.pgmustard.com/blog/queries-for-pg-stat-statements

https://blog.rustprooflabs.com/2023/05/pg-stat-statements-performance-differences

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

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

相关文章

从 0~1 创建 Vue2 项目

前言 从0开始搭建Vue2项目;介绍项目目录结构;为了项目方便需要添加的配置。创建 Vue2 项目共有两种方式: 手动选择;选择默认模式。 给孩子点点关注吧!😭 一、环境准备 1.1 安装包管理工具 1.1.1 安装 …

CentOS7安装MySQL

CentOS默认安装有MariaDB,这是MySQL的分支。 但还是要在系统中安装MySQL,且安装完成后可直接覆盖MariaDB。 1、下载并安装MySQL官方 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面命令就…

VS Code 常用插件推荐

VS Code 常用插件推荐 1. Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 适用于 VS Code 的中文(简体)语言包 2. Auto Rename Tag 自动关闭标签,写 html 标签的时候可以重命名标签名。 现在 vscode 已经内置了&…

分享2个教学视频录制的方法!

案例:如何录制教学视频? 【我是一名老师,我想录制一些教学视频发布在网络平台上,但是我不知道如何操作。有没有人知道录制教学视频需要什么工具?如何录制?】 随着在线教育的普及,越来越多的教…

三位一体,铸就无敌铁军!海陆空协同,开启集群新篇章!

在机器人领域,多机器人系统的研究一直是一大热点,众多高校与研究所逐步投入到机器人集群系统的研究当中,其中无人机编队表演、无人车群园区运输、无人船集群水域监测等集群应用更是进入了大众的视野。但对多机器人集群系统的需求却远不止于此…

KD305Y带吸收比极化指数兆欧表

一、概述 KD305Y绝缘电阻测试仪对众多的电力设备如:电缆、电机、发电机、变压器、互感器、高压开关、避雷器等要求做一系列的绝缘性能试验,首先是要做绝缘电阻测试。近年来随着电力事业的飞速发展,大容量设备的使用不断增加,用普通的兆欧表无…

idm下载器2024官方最新中文版免费下载

哈喽大家好呀,coco玛奇朵发现我已经有一阵子没有给大家分享windows软件了,今天给大家分享一款暗藏惊喜的windows软件,用过之后真的很难拒绝! 这是一个可以帮你提升下载速度的工具,有了它几秒就能帮你下载好各种资源。…

Ubuntu 增加swap交换内存

一、创建虚拟内存 在实际开发中发现swap交换分区不够用了,于是需要创建虚拟内存来增加交换分区的大小。 在系统空闲空间位置创建swap虚拟内存专用文件夹 cd /data //切到你想要创建交换分区的目录 mkdir swap //新建文件夹swap cd swap //进入swap文件夹 备…

el-table多级嵌套列表,菜单使用el-switch代替

需求:根据el-table实现多级菜单复选,并且只要是菜单就不再有复选框,也没有全选按钮,一级菜单使用el-switch代替原有的列复选框,子级如果全部选中,那么父级的el-switch也会被选中,如下图&#xf…

亿发工业互联网智能制造ERP系统,生产工厂信息化建设解决方案

亿发工业互联网智能制造ERP系统,生产工厂信息化建设解决方案 随着制造水平的发展,传统工厂原有的生产组织模式和质量管理模式已不能满足先进制造水平的要求。确保公司战略目标的实现,有必要借助信息技术加强对各种业务流程的管理。而企业走向…

10个最流行的向量数据库【AI】

矢量数据库是一种将数据存储为高维向量的数据库,高维向量是特征或属性的数学表示。 每个向量都有一定数量的维度,范围从几十到几千不等,具体取决于数据的复杂性和粒度。 推荐:用 NSDT场景设计器 快速搭建3D场景。 矢量数据库&…

FE_Vue框架的重要属性讲解【ref props mixin】

1 ref属性 对于传统的HTML而言,id 和 ref确实没有什么差别,但是对于组件来说就不一样了。给组件加id,打印出获取的结果为组件所对应的完整DOM结构。给组件加ref,打印出获取的结果就是VueComponent实例。 被用来给元素或子组件注册…

软考A计划-重点考点-专题十(算法分析与设计)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置[升级1](Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

剑指 Offer 34. 二叉树中和为某一值的路径

题目描述: 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 题目来源 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,nul…

mac iterm2设置rz sz文件传输

1、安装lrzsz $ brew install lrzsz 2、创建并设置iterm2-send-zmodem.sh sudo vim /usr/local/bin/iterm2-send-zmodem.sh # /usr/local/bin/iterm2-send-zmodem.sh#!/bin/bash # Author: Matt Mastracci (matthewmastracci.com) # AppleScript from http://stackoverflow.com…

Cy5.5-PEG2000-Biotin,Cy5.5-聚乙二醇-生物素;Biotin-PEG-Cy5.5;可用于检测抗生物素、链霉亲和素或中性生物素

Cyanine5.5-PEG-Biotin,Cy5.5-聚乙二醇-生物素 中文名称;Cy5.5-聚乙二醇-生物素 英文名称;Cyanine5.5-PEG-Biotin 性状:粘稠液体或固体粉末,取决于分子量大小 溶剂:溶于水、氯仿、DMSO等常规性有机溶剂 分子量PEG:1k、2k、3.…

高薪Android开发工程师面试题必备!

5-6月各种补招和散招才是招聘高峰,也是拿offer的高峰,机会多多。 悲观者往往正确,但乐观者往往成功。不要制造焦虑吓自己。 多为面试准备准备,机会多多也要把握住! 以下都是一线互联网大厂最常见的几个问题&#xf…

文件上传漏洞详解

0x01 上传漏洞定义 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件…

MySQL索引

目录 一、索引的概述二、索引的作用2.1 索引是如何实现?2.2 使用索引的副作用 三、创建索引的原则依据四、MySQL的优化哪些字段/场景适合创建索引?五、索引的分类及创建5.1 普通索引直接创建索引修改表方式创建创建表的时候指定索引 5.2 唯一索引直接创建…