首页 > 数据库 >教你处理数仓慢SQL常见定位问题

教你处理数仓慢SQL常见定位问题

时间:2022-10-28 11:15:55浏览次数:71  
标签:数仓慢 定位问题 time -- statement SQL query unique

摘要:通常在运维监控出现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等待事件,进一步优化。

 

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

标签:数仓慢,定位问题,time,--,statement,SQL,query,unique
From: https://www.cnblogs.com/huaweiyun/p/16835126.html

相关文章

  • SQL注入
    SQL注入一、简介:将SQL语句添加到输入参数,传递到服务器解析并执行SQL语句的一种攻击手段。对于用户提交的参数未进行过滤达到SQL语句执行,黑客可以利用该漏洞执行任意S......
  • (Linux安装)Mysql5.7数据库
    下载地址:https://downloads.mysql.com/archives/community/ 1.解压tar-xvfmysql-5.7.26-linux-glibc2.12-x86_64.tar 2.再移动并重命名一下mvmysql-5.7.26-linu......
  • SQL Server之选出某个字段中全部为数字或全部为字母的记录
    https://blog.csdn.net/jclian91/article/details/78197736这个问题可以用SQL的通配符来解决,我们以下面的sample_table表为例: 现在我们选出表......
  • MySQL 5.0版本的安装步骤
    一、MYSQL的安装1、以管理员的身份运行“mysql_setup.exe”2、点击“Next”3、选择“Iacceptthetermsinthelicenseagreement”点击“Next”4、选择安装类型,“Typ......
  • 如何在winform打包时带上sqlite数据库
    sqlite数据库下载及使用:https://blog.csdn.net/Yyuanyuxin/article/details/105508886sqlite数据库可视化工具——DB.Browser安装说明:https://blog.csdn.net/Yyuanyuxin/a......
  • Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class
    这是在弄那个政策查询系统的时候遇到的报错其实明眼就能看出来是mysql的版本问题,关键是怎么改首先mysql8版本以下的用的是:com.mysql.jdbc.Drivermysql8以上的用的是......
  • MySQL锁
    MySQL锁目录MySQL锁按照锁思想分类乐观锁悲观锁按照锁类型分类读锁(共享锁、S锁)写锁(排他锁、X锁)意向锁意向共享锁(ISLock)意向排他锁(IXLock)按照锁级别分类全局锁(数据库级别......
  • 【MySQL】Navicat15 安装
    #Navicat安装`提示`:鉴于之间已经出了MySQL的安装教程,在这了我也讲下,那个其实包含了两个知识点,既可以小白初次安装MySQL客户端,也面向想安装5.x和8.x两个版本的。---@[T......
  • 慢SQL浅析
    今天和大家聊一个常见的问题:慢SQL。通过本文你将了解到以下内容:慢SQL的危害SQL语句的执行过程存储引擎和索引的那些事儿慢SQL解决之道后续均以MySQL默认存储引擎In......
  • Ubuntu 22.04 安装 MySQL
    本文记录了在Ubuntu22.04下安装MySQL8.0和5.7版本的步骤。下载文件在https://downloads.mysql.com/archives/community/发行地址中选择Linux-Generic操作......