GaussDB单SQL性能慢分析

news2024/12/26 9:29:28

文章目录

  • 问题描述
  • 问题现象
  • 告警
  • 单SQL性能慢分析
    • 步骤一:确定目标SQL
    • 步骤二:收集统计信息、提前排除影响
    • 步骤三:分析SQL性能瓶颈
  • 单SQL性能慢-视图分析
    • 流控导致慢SQL
    • 并发锁冲突导致慢SQL
    • 表膨胀导致大量的死元组
    • 业务语句不优、计划不优

问题描述

单SQL性能慢,客户作业对时延要求或者不满足客户预期。

问题现象

  • 查看告警,发现慢SQL告警。
  • 分析WDR报告有异常SQL。
  • 长时间未结束的SQL。
  • 用户反馈慢SQL。

告警

  • 业务侧相关接口时延、成功率等告警。
  • 数据库内核P80/P95相关告警

单SQL性能慢分析

在这里插入图片描述

步骤一:确定目标SQL

  • 主动发现:
    1. 查看告警,发现慢SQL告警。
    2. 定期巡检WDR报告发现异常SQL,如CPU消耗较多的Top SQL等。
    3. 长事务告警,发现有长时间未结束的SQL。
  • 被动调优:用户、业务反馈慢SQL。

步骤二:收集统计信息、提前排除影响

  1. 获取完整的SQL语句和SQL中相关表的结构、索引信息、表大小和索引大小等信息。
  2. 获取数据库的参数配置信息,包括work_mem、maintance_work_mem、shared buffers等,比如排序操作或者hash操作语句可能因为work_mem太小而影响执行执行效率。
  3. 获取SQL中相关结构的pgstat信息,pgstat相关可以用来分析vacuum和analyze情况、以及表和索引的状态信息,这部分可以通过pg_stat_all_tables, pg_stat_all_indexes, pg_statio_all_tables, pg_statio_all_indexes等视图获取,具体视图分析请参考“单SQL性能慢-视图分析”。
  4. 对于有可能写大量日志的慢SQL,需要先确认该环境是否有开启流控(recovery_time_target)操作,为了保证RTO对于突然激增的xlog日志,流控可能会限制xlog同步到备机的速度,导致语句执行变慢,具体排查方法请参考“单SQL性能慢-视图分析”。
  5. 收集慢SQL对应时间段的系统资源情况,确认系统资源是否有异常。

步骤三:分析SQL性能瓶颈

  • 如果目标SQL长时间未结束。

    1. 首先确定SQL慢在什么地方,可以通过pg_thread_wait_status或者ASP信息分析该SQL的Top Wait Event信息,具体分析方法参考“单SQL性能慢-视图分析”,其中等待事件的说明请参考•异常等待事件。
    2. 如该SQL有大量的等锁事件,可以通过ASP中的block sessionid信息找到锁等待关系,并确定等锁的原因。
    3. 如果语句执行时间超过慢SQL阈值log_min_duration_statement,可以通过Full SQL视图查看计划,具体分析方法请参考“单SQL性能慢-视图分析”。
    4. 根据找到的慢SQL,跟业务沟通是否能获取完成的业务SQL,尝试复现。
  • 单SQL一直慢。

    • 拿到慢SQL语句首先考虑通过explain获取计划,能快速确定语句的性能瓶颈点,并结合步骤2获取的信息分析具体原因。
    • 另外可以通过summary_statement和statement_history分析SQL的KPI信息,首先可以通过SQL的时间模型确定具体的耗时阶段,然后结合行活动、语句级别wait event等信息确定SQL的耗时原因,具体分析参考“单SQL性能慢-视图分析”。
  • 单SQL偶现慢。

    • 如果SQL的执行时间超过慢SQL阈值log_min_duration_statement,则通过statement_history查看慢SQL的执行计划、时间模型、行活动、wait event、锁等信息,其中一方面从计划进行分析,其他参考“单SQL性能慢-视图分析”。
    • 如果慢SQL的top wait event有等事件,可以通过ASP信息查看会话间的锁等待关系。
    • 如果语句执行时间没超过log_min_duration_statement阈值,第一种可以考虑打开full SQL,set track_stmt_stat_level = ‘L1,L1’,需要注意打开会SQL会记录所有执行的语句(可以会话级别打开),会占用大量的磁盘,用完后要理解关闭;第二种可以考虑调用动态接口,对固定的慢进行跟踪。一般是先通过慢SQL视图分析,通过gs_asp查看慢SQL对应的wait event信息,通过statement_history查看慢SQL信息。
select * from dynamic_func_control('GLOBAL', 'STMT', 'TRACK', '{"3182919165", "L1"}');   -- 抓此SQL的FULLSQL L2 
select * from dynamic_func_control('GLOBAL', 'STMT', 'UNTRACK', '{"3182919165"}');      -- 取消抓取 
select * from dynamic_func_control('GLOBAL', 'STMT', 'LIST', '{}'); 
select * from dynamic_func_control('LOCAL', 'STMT', 'CLEAN', '{}');

单SQL性能慢-视图分析

流控导致慢SQL

常见于批量导数、压测或者批量提交的场景。

  1. 在慢SQL出现的时间段内搜索sleep相关字样。
  2. 执行如下SQL语句,如果current_sleep_time字段有值说明有流控产生。
SELECT * FROM dbe_perf.global_recovery_status

并发锁冲突导致慢SQL

  1. 如果达到慢SQL阈值log_min_duration_statement,则查看statement_history的Top wait event。
SELECT statement_detail_decode(details, 'plaintext', true) FROM DBE_PERF.get_global_slow_sql_by_timestamp('start time','end time') WHERE unqiue_sql_id = xxx;
  1. 如果慢SQL没有达到SQL阈值log_min_duration_statement,可以直接查看对应时间时间段的dbe_perf.local_active_session/gs_asp信息,查看对应的wait event,如果是实时的SQL慢则参考5。
  2. 如果Top Wait event为acquire lock,通过ASP信息分析lock的等锁超时,找到对应的block_sessionid,通过查询以下SQL,查询阻塞该语句的会话。
SELECT * FROM gs_asp WHERE sample_time > 'start_time' and sample_time < 'end_time' and query like 'xxx';
  1. 根据block sessionid找到对应的session信息。
SELECT * FROM gs_asp WHERE sample_time > 'start_time' and sample_time < 'end_time' and query like 'xxx' and sessionid = $block sessionid;
  1. 实时运行SQL慢,找到对应的block_sessionid,通过查询以下SQL,查询阻塞该语句的会话。
SELECT a.*,b.wait_status, b.wait_event FROM pgxc_stat_activity as a left join pgxc_thread_wait_status as b on a.pid = b.tid and a.sessionid = b. sessionid and a.coorname = b.node_name and b.sessionid = $block_sessionid;
  1. 分析找到的会话信息,如果该会话的wait event为wait cmd,说明该会话上的语句已经执行完成,等待客户端发信息。

表膨胀导致大量的死元组

  1. 如果达到慢SQL阈值log_min_duration_statement,则查看statement_history/ DBE_PERF.get_global_slow_sql_by_timestamp,如果data_io_time较高或者是n_blocks_fetched- n_blocks_hit加大,说明SQL加载大量的页面导致SQL时延增加。
SELECT * FROM DBE_PERF.get_global_slow_sql_by_timestamp('start time','end time');
  1. 如果SQL未达到慢SQL阈值,第一种可以考虑打开full SQL,set track_stmt_stat_level = ‘L1,L1’,需要注意打开会SQL会记录所有执行的语句(可以会话级别打开),会占用大量的磁盘,用完后要理解关闭;第二种可以考虑调用动态接口,对固定的慢进行跟踪。
SELECT * FROM dynamic_func_control('GLOBAL', 'STMT', 'TRACK', '{"3182919165", "L1"}');   -- 抓此SQL的FULLSQL L2 
SELECT * FROM dynamic_func_control('GLOBAL', 'STMT', 'UNTRACK', '{"3182919165"}');      -- 取消抓取 
SELECT * FROM dynamic_func_control('GLOBAL', 'STMT', 'LIST', '{}'); 
SELECT * FROM dynamic_func_control('LOCAL', 'STMT', 'CLEAN', '{}');
  1. 通过查看SQL的计划explain(buffers, analyze)查看具体的IO情况,如果语句走索引但是head fetch较大,扫描的行较少,说明需要做大量的可见性判断。
  2. 查看慢SQL对应的表的pgstat信息,如果n_dead_tup显示有大量的死元组,或者last_vacuum显示长时间未做vacuum,需要对相关的表做vacuum。
SELECT * FROM pg_stat_all_tables where relname = 'xxx';

业务语句不优、计划不优

  1. 收集SQL相关的表的结构、索引、表和索引大小等信息。
  2. 如果达到慢SQL阈值log_min_duration_statement,则查看statement_history/
DBE_PERF.get_global_slow_sql_by_timestamp,获取SQL的计划。
SELECT * FROM DBE_PERF.get_global_slow_sql_by_timestamp('start time','end time');
  1. 如果SQL未达到慢SQL阈值,第一种可以考虑打开full SQL,set track_stmt_stat_level = ‘L1,L1’,需要注意打开会SQL会记录所有执行的语句(可以会话级别打开),会占用大量的磁盘,用完后要理解关闭;第二种可以考虑调用动态接口,对固定的慢进行跟踪,以获取SQL的计划信息。
SELECT * FROM dynamic_func_control('GLOBAL', 'STMT', 'TRACK', '{"3182919165", "L1"}');   -- 抓此SQL的FULLSQL L2 
SELECT * FROM dynamic_func_control('GLOBAL', 'STMT', 'UNTRACK', '{"3182919165"}');      -- 取消抓取 
SELECT * FROM dynamic_func_control('GLOBAL', 'STMT', 'LIST', '{}'); 
SELECT * FROM dynamic_func_control('LOCAL', 'STMT', 'CLEAN', '{}');
  1. 或者通过explain查看语句的计划信息。
    根据SQL的计划信息和对应的表、索引的信息确认SQL语句是否可以优化,或者索引是否有缺失等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8自由度并联腿机器狗实现姿态平衡

1. 功能说明 本文示例将实现8自由度并联腿机器狗保持姿态平衡的功能&#xff0c;当机器狗在一个平台上原地站立&#xff0c;平台发生倾斜时&#xff0c;机器狗能够自动调整姿态&#xff0c;保证背部水平。 2. 机器狗的稳定性分析 稳定性是机器狗运动中很重要的一部分&#xff0…

Leetcode | 35 搜索插入位置

35 搜索插入位置 文章目录 35 搜索插入位置题目我的思路[官方题解](https://leetcode.cn/problems/search-insert-position/solutions/333632/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/ "官方题解")欢迎关注公众号【三戒纪元】 题目 给定一个排序数组和一个目标…

Rocky linux 9.0系统安装MySQL5.7

前言 本文将带你在Rocky linux 9.0上折腾一个MySQL5.7&#xff0c; 说干就干。 文章目录 前言安装环境下载mysql 包开始安装启动测试总结 安装环境 删除系统中可能存在的包&#xff1a; [rootmufeng ~]# rpm -qa |grep mysql [rootmufeng ~]# rpm -qa |grep mariadb [rootmu…

Ansible概述和模块解释

Ansible概述 Ansible介绍 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能做什么 Ansible能…

Linux---详细讲解linux计算机体系结构

前言 Linux是一种开源的操作系统&#xff0c;它的核心思想是基于冯诺依曼体系结构。在本文中&#xff0c;我们将深入探讨Linux的基本原理和操作系统的概念。 Linux是一款基于Unix操作系统的开源软件&#xff0c;它的核心是由Linus Torvalds在1991年开发的。Linux的出现&#x…

认识 Vue.js

node版本管理工具 nvm - 简书 Vue介绍 Vue.js(简称Vue) 是一套用于构建用户界面的渐进式前端框架。&#xff08;其实就是使用js开发的一个框架&#xff09; Vue.js 核心实现 : 响应式的数据绑定&#xff1a;当数据发生改变&#xff0c;视图可以自动更新&#xff0c;不用关心D…

「有问必答」Go如何优雅的对时间进行格式化?

昨天 交流群 关于「Go如何优雅的对时间进行格式化?」展开了讨论&#xff1a; 咋搞捏&#xff1f; 如何在不循环的情况下&#xff0c;把列表数据结构体的时间修改为咱们习惯的格式&#xff0c;而不是UTC模式 我们要实现的效果如下: created_at 是go语言原生的方式&#xff0…

Android Framework分析Zygote进程的启动过程

Zygote进程是Android系统中的一个重要进程&#xff0c;其主要作用是预热Java虚拟机和启动应用进程。本文将着重分析Zygote进程的启动过程&#xff0c;结合代码注释和示例代码&#xff0c;让读者更好地理解Zygote的内部工作原理。 Zygote进程的启动过程 Zygote进程的启动过程包…

Python3 里面的四舍五入

目录 1.一般的四舍五入 : 使用内置的round函数 1.1官方文档&#xff1a; 1.2 举例说明&#xff1a; 2.python3里的格式化输出 format 2.1 记忆法则 &#xff1a;填齐宽 逗精类 2.2 format实质就是通过设置精度间接使用了等效round函数&#xff0c;但是不要把格式化输出和四…

chatgpt赋能python:Python是如何帮助确定location的?

Python是如何帮助确定location的&#xff1f; 什么是location&#xff1f; 在SEO中&#xff0c;location指的是特定页面、文章或者商铺在搜索结果中的排名位置。通常来说&#xff0c;更高的location意味着更多的点击率和流量&#xff0c;因此在SEO中&#xff0c;确定location…

独立站思考:Facebook选品测品

导语&#xff1a;对于独立站而言&#xff0c;获取稳定的流量是至关重要的。本文将探讨如何利用Facebook的选品测品功能&#xff0c;精准找到用户并提高点击率&#xff0c;以及如何通过数据分析优化&#xff0c;提高转化率并快速产生订单。 第一部分&#xff1a;精准定位用户的方…

Nodejs五、Express

零、文章目录 Nodejs五、Express 1、初识 Express &#xff08;1&#xff09;Express 简介 Express是什么 官方给出的概念&#xff1a;Express 是基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架。 通俗的理解&#xff1a;Express 的作用和 Node.js 内置的 …

Swift 5.9 有哪些新特性(一)

文章目录 前言if 和 switch 表达式Value 和 Type 参数包 前言 虽然 Swift 6 已经在地平线上浮现&#xff0c;但 5.x 版本仍然有很多新功能-更简单的 if 和 switch 用法、宏、非可复制类型、自定义 actor 执行器等等都将在 Swift 5.9 中推出&#xff0c;再次带来了一个巨大的更…

矩阵补全文献汇总

[1] Nguyen L T , Kim J , Shim B .Low-Rank Matrix Completion: A Contemporary Survey[J].IEEE Access, 2019, PP(99):1-1.DOI:10.1109/ACCESS.2019.2928130. 几根棒子的一篇工作。基本结构可以借鉴。 适用于秩未知的矩阵补全文献汇总 [1] Fornasier M , Rauhut H , Ward…

报表岗位如何快速升职加薪?卷的心态要放平,工具要选对!

最近下班时一直看到做报表的部门每个人埋头苦干&#xff0c;不用说&#xff0c;这是又在忙半年度报告了。 现在&#xff0c;报表内卷现象十分严重&#xff0c;大家可能用的是一样的数据集&#xff0c;虽说每个人输出的报告可能结果差异不大&#xff0c;但懂得怎么利用工具&…

在HR眼里,IE证书早就不值钱了

大家好&#xff0c;我是老杨。 最近项目实在是忙&#xff0c;内容都写的少了一些&#xff0c;真的是有点力不从心的意思&#xff0c;人年纪大了&#xff0c;比不起当初年轻的自己了 和同事领导在一块儿的时间越多&#xff0c;就免不了聊到今年的就业环境。 我不提&#xff0…

Vue中如何进行代码编辑器与实时预览?

Vue中如何进行代码编辑器与实时预览&#xff1f; 在现代Web应用程序中&#xff0c;代码编辑器和实时预览已经成为了必不可少的一部分。Vue作为一款流行的JavaScript框架&#xff0c;也提供了一些工具和库&#xff0c;方便开发者在Vue中集成代码编辑器和实时预览功能。本文将介…

基于Eclipse+Java+Swing+Mysql实现超市销存管理系统

基于EclipseJavaSwingMysql实现超市销存管理系统 一、系统介绍二、功能展示1.登陆2.整体页面3.进货4.售货5.查询6、退出系统 三、数据库四、其它1.其他系统实现五.获取源码 一、系统介绍 系统实现了&#xff1a;商品进货、商品销售、库存查询 、进货查询、 售货查询、退出系统…

Date类(Java)

文章目录 1. 介绍2. 分析3. 方法3.1 Constructor()3.2 getTime()3.3 compareTo()3.4 equals() 1. 介绍 A. 类介绍&#xff1a;类Data表示特定的瞬间&#xff0c;可以精确到毫秒  Date类 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值  从 JDK 1.1 开始&…

Python自动化测试的配置层实现方式对标与落地 | 京东云技术团队

Python中什么是配置文件&#xff0c;配置文件如何使用&#xff0c;有哪些支持的配置文件等内容&#xff0c;话不多说&#xff0c;让我们一起看看吧~ 1 什么是配置文件&#xff1f; 配置文件是用于配置计算机程序的参数和初始化设置的文件&#xff0c;如果没有这些配置程序可能…