postgresql慢查询排查和复现

postgresql慢查询排查和复现

一. 介绍一张表:pg_stat_activity

pg_stat_activity 是 PostgreSQL 中一个非常有用的系统视图,提供了有关当前数据库连接和活动查询的信息。通过查询这个视图,你可以获取有关正在执行的查询、连接的用户、进程 ID 等信息。以下是 pg_stat_activity 视图中的一些关键列:

  1. datid: 数据库标识符,表示正在连接的数据库的唯一标识符。
  2. datname: 数据库名称。
  3. pid: 进程 ID,表示数据库连接的唯一标识符。
  4. usesysid: 连接用户的系统标识符。
  5. usename: 连接用户名。
  6. application_name: 连接的应用程序名称(如果应用程序设置了名称)。
  7. client_addr: 客户端的 IP 地址。
  8. client_hostname: 客户端的主机名。
  9. client_port: 客户端连接使用的端口。
  10. backend_start: 连接开始时的时间戳。
  11. xact_start: 事务开始时的时间戳。
  12. query_start: 查询开始执行的时间戳。
  13. state: 连接状态(例如,idle、active、idle in transaction 等)。
    • active: 表示当前连接正在执行查询或事务。
    • idle: 表示当前连接处于空闲状态,没有正在执行的查询或事务。
    • idle in transaction: 表示当前连接处于事务中,但没有正在执行的查询。可能是事务开始后一段时间没有活动。
    • idle in transaction (aborted): 表示当前连接处于事务中,但由于某种原因事务已被中止。
    • fastpath function call: 表示当前连接正在执行一个快速路径函数调用。
    • disabled: 表示当前连接的活动状态已被禁用。
  14. query: 当前正在执行的查询文本。
  15. waiting: 是否在等待锁。

pg_stat_activity 视图,可以监视当前数据库连接的活动状态,了解哪些查询正在执行及运行时间等信息。

二. 复现慢查询

在查询中引入延迟,pg_sleep() 是 PostgreSQL 中的一个函数,用于在查询中引入延迟。这个函数会使查询进程休眠指定的秒数。如果不提供参数,默认为 0 秒。切记不要再生产环境使用.

SELECT pg_sleep(100); -- 这将使查询休眠100秒钟
三. 排查慢查询语句

总的来说,这个查询可以识别数据库中运行时间较长的查询(下面是排查超过30秒的sql,可根据实际需要修改)。

SELECT pid, datname, usename, query, extract(epoch from (now() - query_start)) as total_time, count(1) AS slowsql_count FROM pg_stat_activity where state not in('idle') and query !='' and extract(epoch from (now() - query_start)) > 30  GROUP BY pid, datname, usename, query, total_time;
  1. SELECT pid, datname, usename, query, extract(epoch from (now() - query_start)) as total_time, count(1) AS slowsql_count
    • pid: 进程ID,表示数据库连接的唯一标识符。
    • datname: 数据库名称。
    • usename: 执行查询的用户名称。
    • query: 正在执行的查询文本。
    • extract(epoch from (now() - query_start)) as total_time: 通过计算当前时间与查询开始时间的差值,获取查询已运行的总时间(以秒为单位)。
    • count(1) AS slowsql_count: 用于计算相同查询的数量,即慢查询的数量。
  2. FROM pg_stat_activity
    • 从 PostgreSQL 的 pg_stat_activity 视图中选择活跃的数据库连接信息。这个视图包含了关于当前数据库会话和查询的统计信息。
  3. WHERE state NOT IN ('idle') AND query != '' AND extract(epoch from (now() - query_start)) > 10
    • state NOT IN ('idle'): 确保排除处于空闲状态的数据库连接,只选择活跃的连接。
    • query != '': 排除空查询,确保只选择正在执行的查询。
    • extract(epoch from (now() - query_start)) > 30: 选择运行时间超过30秒的查询。
  4. GROUP BY pid, datname, usename, query, total_time
    • 对选择的结果进行分组,以便聚合相同查询的统计信息。

查询结果:成功定位到慢查询语句:SELECT pg_sleep(100);

在这里插入图片描述

四. 慢查询优化方案
  1. 查询优化:
    • 通过使用 EXPLAIN 分析查询计划,了解 PostgreSQL 是如何执行查询的。优化查询计划可以提高查询性能。
    • 调整查询,避免不必要的全表扫描,确保正确使用索引。
  2. 索引优化:
    • 确保表上的索引是合理的,并涵盖了查询中用于筛选和排序的列。
    • 避免过多的索引,因为它们可能会导致性能下降。
  3. 统计信息更新:
    • 确保 PostgreSQL 统计信息是最新的。自动化统计信息更新可以通过 PostgreSQL 的自动统计信息收集器来完成。
  4. 分区表:
    • 对大型表进行分区,可以提高查询性能,尤其是对那些经常使用范围查询的表。
  5. 调整内存配置:
    • 调整 shared_bufferseffective_cache_size 参数,以确保数据库能够充分利用系统内存。
  6. 定期维护:
    • 定期执行 VACUUMANALYZE 操作,以确保表的空间得到优化,同时更新统计信息。
  7. 使用连接池:
    • 考虑使用连接池,例如 PgBouncer,以减轻数据库服务器的负载。
  8. 日志和监控:
    • 启用 PostgreSQL 的查询日志,并使用工具如 pgBadger 分析日志,以便及时发现慢查询。
    • 使用监控工具,如 pg_stat_statements 扩展,监视查询性能。
  9. 升级 PostgreSQL 版本:
    • 考虑升级到最新的 PostgreSQL 版本,因为新版本通常包含性能改进和优化。
  10. 使用扩展:
    • 考虑使用一些性能优化的扩展,例如 pg_repack 用于表重组,pg_partman 用于表分区等。

常包含性能改进和优化。
10. 使用扩展:
- 考虑使用一些性能优化的扩展,例如 pg_repack 用于表重组,pg_partman 用于表分区等。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Demo: 前端生成条形码并打印

前端生成条形码并打印 安装依赖&#xff1a; npm i print-js // 打印 npm i jsbarcode // 生成条形码 <template><div id"printContent" style"display: none;"><div id"elTable"><div class"name">名称&…

微信开放平台第三方授权(第二篇)

1.授权步骤开发 参考牛人的文档&#xff0c;按照步骤集成。 配置微信第三方平台中的授权事件接收URL&#xff1a;http://my-domain/notify/receive_ticket配置微信第三方平台中的公众号消息与事件接收URL http://my-domain/notify/APPID/callback首次启动后需要 等待收到 微信推…

VUE3动漫影视视频网站模板源码

文章目录 1.视频设计来源1.1 主界面1.2 动漫、电视剧、电影视频界面1.3 播放视频界面1.4 娱乐前线新闻界面1.5 关于我们界面 2.效果和源码2.1 动态效果2.2 源码结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…

GBASE南大通用分享-ConnectionTimeout 属性

GBASE南大通用分享 获取或设置连接超时时间&#xff0c;值为‚0‛时没有限制。  语法 [Visual Basic] Public Overrides ReadOnly Property ConnectionTimeout As Integer Get [C#] public override int ConnectionTimeout { get; }  实现 IDbConnection.Connecti…

【文本到上下文 #7】探索 NLP 中的 Seq2Seq、编码器-解码器和注意力机制

一、说明 今天&#xff0c;我们将探讨序列到序列 &#xff08;seq2seq&#xff09; 模型的复杂工作原理&#xff0c;特别关注编码器-解码器架构和注意力机制。这些概念是各种 NLP 应用的基础&#xff0c;从机器翻译到问答系统。 这是可以期待的&#xff1a; Seq2Seq模型中的编码…

Android Automotive:在路上释放 Android 操作系统的力量

Android Automotive&#xff1a;在路上释放 Android 操作系统的力量 Android 在汽车行业的历程车载信息娱乐系统 (IVI) 的演变汽车中的 Android&#xff1a;演变和进步Android 汽车操作系统的崛起Polestar 2&#xff1a;开创 Android 汽车体验Android 开源项目 (AOSP) 及其他项…

ATAC-seq发篇测序文章就结束了吗?看如何利用ATAC-seq数据为后续关键基因的转录调控研究提供重要依据

染色质可及性&#xff08;Chromatin Accessibility&#xff09;是染色质的一种特性&#xff0c;为转录因子结合靶基因提供了空间。转座酶可及染色质测序分析&#xff08;ATAC-seq&#xff09;是常见的研究染色质可及性的方法&#xff0c;ATAC-seq联合RNA-seq是一种新的研究思路…

【前端开发】CSS中的:hover伪类选择器 你真的搞懂怎么去使用它吗?

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

某大厂关于Linux系统相关面试题

一、Linux系统和Shell 1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容&#xff0c;要求&#xff1a;(1) 删除所有空行&#xff1b;(2) 在非空行前面加一个"AAA"&#xff0c;在行尾加一个"BBB"&#xff0c;即将内容为11111的一行改为&#xff1…

【Linux】第三十八站:信号处理

文章目录 一、信号处理二、再谈进程地址空间三、内核如何实现信号的捕捉四、sigaction 一、信号处理 我们知道&#xff0c;信号保存以后&#xff0c;会在合适的时候进行处理这个信号。 那么信号是如何被处理的&#xff1f;什么时候进行处理呢&#xff1f; 当我们的进程从内核…

如何在Microsoft 365中直接启用 Loop服务

Microsoft Loop是一种变革性共同创建体验&#xff0c;可将工具和设备上的团队、内容和任务汇集在一起&#xff0c;使团队能够共同思考、规划和创建内容。 在之前分享过的文章中已经介绍了如何在Microsoft Teams、Outlook和Word中使用Loop服务&#xff0c;今天继续介绍如何在Mi…

微信小程序上传时报错message:Error: 系统错误,错误码:80051,source size 2148KB exceed max limit 2MB

问题&#xff1a; 微信小程序上传时错误码&#xff1a;80051,source size 2248KB exceed max limit 2MB 问题原因&#xff1a; 由于代码中的静态资源 图片大小超了200k以及主包的体积超出1.5M 解决办法 分包 tabBar 是主包的&#xff0c;不需要分包处理&#xff0c;以下是分…