摘要:通常在运维监控出现CPU使用率较高、P80/P95指标较高、慢SQL数量上升等现象,或者业务出现超时报错时,优先应排查是否出现慢SQL。

本文分享自华为云社区《GaussDB慢SQL常见定位处理手段》,作者:酷哥。

关键指标

通常在运维监控出现CPU使用率较高、P80/P95指标较高、慢SQL数量上升等现象,或者业务出现超时报错时,优先应排查是否出现慢SQL。

定位慢SQL手段

实时慢SQL查询

查询当前执行时间TOP10的SQL,识别长时间未结束的SQL后可以手动中止。

select
a.pid,
a.sessionid,
a.datname,
a.usename,
a.application_name,
a.client_addr,
a.xact_start,
a.query_start,
(now() - a.query_start)::text as query_runtime,
a.unique_sql_id,
w.wait_status,
w.wait_event,
w.locktag,
w.lockmode,
w.block_sessionid,
a.query
from
pg_stat_activity a join
pg_thread_wait_status w on
a.sessionid = w.sessionid
where
a.pid <> pg_backend_pid()
and a.state = 'active'
and a.client_addr is not null
order by
query_runtime desc;

根据查询结果,如果是等待锁,可以结合锁等待信息进一步分析,其他情况可以根据unique_query_id关联WDR报告、statement视图进一步分析慢的根因。

历史慢SQL查询

思路:根据CPU、慢SQL等监控指标,定位慢SQL出现的时间范围,通过以下几种方式进一步分析。

整体运行情况分析:WDR报告

通过导出对应时间段的WDR报告,可以分析耗时较长的SQL,WDR报告生成方法参见产品文档。

单次执行情况分析:statement_history

statement_history记录了执行时间超过阈值(log_min_duration_statement,默认3 s)的详细SQL信息,包含计划生成时间、执行时间、锁等待时间等信息,其中部分信息与参数track_stmt_stat_level设置的级别(默认为'OFF,L0')有关。 设置参数track_stmt_stat_level='OFF,L1'后,statement_history中可以记录计划信息、锁等待时间等信息。 必须在postgres库内查询,根据时间段查询慢SQL(按照执行时间排序)

SELECT
*,
finish_time - start_time as run_time
FROM
dbe_perf.statement_history
WHERE
start_time > '2022-07-08 18:00:00'
AND start_time < '2022-07-08 19:00:00'
-- 根据unique_query_id可以过滤出特定的查询
-- AND unique_query_id = 123456
ORDER BY
run_time desc;

单个Query运行情况分析:statement

statement记录了SQL按照unique_sql_id归一化的执行信息,包括执行次数、总的执行时间、访问数据量、内存使用等信息。 根据unique_sql_id查询历史执行信息

SELECT
*,
total_elapse_time / n_calls as avg_elapse_time
FROM
dbe_perf.statement
WHERE
unique_query_id = 123456;

动态抓取执行信息(计划、锁等待时间等)

为了避免对生产环境产生影响,可以动态抓取SQL执行信息

-- 抓取指定unique_sql_id的全量SQL信息
-- 示例:unique_sql_id为3267119089,全量SQL级别为L2,相当于track_stmt_stat_level='L2,off'
select * from dynamic_func_control('LOCAL', 'STMT', 'TRACK', '{"3267119089", "L2"}');
-- 打开之后,查询statement_history
-- 关闭抓取,清理
select * from dynamic_func_control('LOCAL', 'STMT', 'UNTRACK', '{"3267119089"}');
select * from dynamic_func_control('LOCAL', 'STMT', 'LIST', '{}');
select * from dynamic_func_control('LOCAL', 'STMT', 'CLEAN', '{}');

查看会话快照信息

SELECT
*
FROM
dbe_perf.local_active_session
WHERE
query_start_time > '2022-07-08 18:00:00'
AND query_start_time < '2022-07-08 19:00:00'
AND unique_query ilike '%%';

常用处理手段

中止慢SQL

根据查询结果中的pid和sessionid,使用函数中止查询

select pg_terminate_session(pid,sessionid);

优化SQL

更新统计信息

查看统计信息

select * from pg_stats where tablename = '表名';
select * from pg_stats where tablename = '表名' and attname = '列名';

更新统计信息

analyze tablename;

手动设置列的distinct值(该字段不同值的数量,选择率 ~ 总行数/distinct值)

ALTER TABLE tablename ALTER COLUMN colname SET (n_distinct = 实际值);
analyze tablename; -- analyze执行后生效

-- 取消设置
ALTER TABLE tablename ALTER COLUMN colname RESET (n_distinct);
analyze tablename; -- analyze执行后生效

使用hint优化计划

  • 通过分析慢SQL的计划,可以使用hint进行调整,openGaussc常用的hint包括:
  • Join顺序的Hint,语法示例:/+ leading((t1 t2))/
  • Join方式的Hint,语法示例:/+ nestloop(t1 t2)/
  • Scan方式的Hint,语法示例:/+ indexscan(t1 index1)/
  • 优化器GUC参数的Hint,语法示例:/+ set(param value)/
  • Custom Plan和Generic Plan选择的Hint,语法示例:/+ use_cplan/
  • ....

修改参数

根据慢SQL分析结论,可以考虑修改GUC参数,但是修改参数同时也会影响其他查询的计划,属于高风险操作。

其他

对于整体执行慢,可以通过分析WDR报告中TOP等待事件,进一步优化。

点击关注,第一时间了解华为云新鲜技术~

教你处理数仓慢SQL常见定位问题的更多相关文章

  1. 【大数据课程】高途课程实践-Day02:利用Hive SQL编写离线数仓实现可视化展示

    〇.概述 1.实现内容 使用Hive SQL编程,构造分层离线数仓 并可以通过Quick Bi进行展示 2.过程 (1)数据接⼊到ODS层 (2)进⾏ODS到DWD层数据开发 (3)进⾏ODS到DIM ...

  2. 【大数据面试】【框架】Linux命令、Shell工具、常见Shell脚本(群起脚本、数仓导入)

    一.Linux 1.常用高级命令 ps -ef:查看进程详情,ps -ef|grep dae可以搜索指定进程,-e表示环境变量 ps -au:以用户为主的详细格式,显示进程平均占用资源,不包括cmd列 ...

  3. Hive 数仓中常见的日期转换操作

    (1)Hive 数仓中一些常用的dt与日期的转换操作 下面总结了自己工作中经常用到的一些日期转换,这类日期转换经常用于报表的时间粒度和统计周期的控制中 日期变换: (1)dt转日期 to_date(f ...

  4. HAWQ取代传统数仓实践(十九)——OLAP

    一.OLAP简介 1. 概念 OLAP是英文是On-Line Analytical Processing的缩写,意为联机分析处理.此概念最早由关系数据库之父E.F.Codd于1993年提出.OLAP允 ...

  5. CarbonData:大数据融合数仓新一代引擎

    [摘要] CarbonData将存储和计算逻辑分离,通过索引技术让存储和计算物理上更接近,提升CPU和IO效率,实现超高性能的大数据分析.以CarbonData为融合数仓的大数据解决方案,为金融转型打 ...

  6. 基于MaxCompute的数仓数据质量管理

    声明 本文中介绍的非功能性规范均为建议性规范,产品功能无强制,仅供指导. 参考文献 <大数据之路——阿里巴巴大数据实践>——阿里巴巴数据技术及产品部 著. 背景及目的 数据对一个企业来说已 ...

  7. 传统 BI 如何转大数据数仓

    前几天建了一个数据仓库方向的小群,收集了大家的一些问题,其中有个问题,一哥很想去谈一谈--现在做传统数仓,如何快速转到大数据数据呢?其实一哥知道的很多同事都是从传统数据仓库转到大数据的,今天就结合身边 ...

  8. PL/SQL常见设置--Kevin的专栏

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  9. 数仓1.4 |业务数仓搭建| 拉链表| Presto

    电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...

  10. 数仓1.1 分层| ODS& DWD层

    数仓分层 ODS:Operation Data Store原始数据 DWD(数据清洗/DWI) data warehouse detail数据明细详情,去除空值,脏数据,超过极限范围的明细解析具体表 ...

随机推荐

  1. Full Tank 题解

    Full Tank 题目大意 给定一张 \(n\) 个点,\(m\) 条边的连通无向图,在每个点有一个加油站,油价为该点的点权,每条边的油耗为该边的边权.现给出若干询问,问一辆油箱容量为 \(c\) ...

  2. Oracle 11g数据库详解(2017-01-23更新)

    Oracle 11g数据库详解 整理者:赤勇玄心行天道 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 ...

  3. 虹科喜报 | 虹科技术工程师【国内首批】拿下Redis认证开发者证书!

    要说虹科数据库技术工程师有多强悍,认证考试2022年12月上线,次年2月就以全国首批速度强势通过考试,并于两周后正式收到[Redis认证开发人员]证书! 虹科小云忍不住浅浅炫耀一下: 或许大家对Red ...

  4. Ansible操作MySQL常用的几个模块

    1. mysql_user 模块 mysql_user模块用来添加,删除用户以及设置用户权限 创建MySQL数据库的用户与口令(非root@localhost用户),直接通过playbooks中的案例 ...

  5. [Python急救站课程]日期和时间的输出

    日期和时间的输出 from datetime import datetime # 引用datetime 库 now = datetime.now() # 获得当前日期和时间信息 print(now) ...

  6. Nebula Graph开源分布式图数据库,万亿级数据,毫秒级延时

    推荐一个分布式图数据库Nebula Graph,万亿级数据,毫秒级延时 什么是Nebula Graph Nebula Graph 是一款开源的.分布式的.易扩展的原生图数据库,能够承载包含数千亿个点和 ...

  7. STM32CUBEIDE 如何将变量定义到指定内存地址

    使用场景如下: 我需要将bootloader/APP的版本号和一些字段信息定义到指定FLASH地址. 在STM32CubeIDE中的方法: 截止当前STM32CubeIDE还没有提供图形化的针对FLA ...

  8. Hibench对大数据平台CDH/HDP基准性能测试

    一.部署方式 1.1.源码/包:https://github.com/Intel-bigdata/HiBench 部署方法: https://github.com/Intel-bigdata/HiBe ...

  9. 为什么FPGA中推荐使用独热码?

    独热码只有一个比特位不同,所以在进行比较的时候: 假如我们要判断状态机是否处于某状态S1,代码如下 格雷码:assign S1 = (STATUS == 2'b01) 二进制码:assign S1 = ...

  10. 关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)

    当在Git中有多个开发者在同一个分支上工作时,可能会发生分支冲突.分支冲突指的是多个开发者在同一时间修改相同的代码文件,导致Git无法自动合并这些更改. 比如说:我在github上进行了md文件的修改 ...