写点什么

打造次世代分析型数据库(五):复杂查询分析工具

  • 2023-10-09
    广东
  • 本文字数:1404 字

    阅读完需:约 5 分钟

打造次世代分析型数据库(五):复杂查询分析工具


作者介绍

shuobjli(李硕),腾讯云数据库专家工程师,主要研究方向为数据库优化器、执行器、索引管理等,目前主要负责 CDW PG 优化器方面的研发工作。


背景介绍

本文主要介绍 CDW PG 全局视图工具的最佳实践。CDW PG 作为分布式数据库,执行 query 需要多个 CN 和 DN 交互运行,对于复杂查询,甚至会出现多层调用的情况。CN 和 DN 出现生产者以及消费者之间的依赖关系,问题相对比较复杂,例如死锁、程序挂起、节点报错等情况。在没有有力定位工具的情况,很难在运维过程中在短时间内定位相关问题。本工具适用于以下场景:

  1. 定位问题 Query 所在的 CN 节点

  2. 通过错误 ID 定位对应的 DN 节点

  3. 出现进程挂起的状况,定位相关的问题节点

总体介绍

CDW PG 在运行过程中有多个节点参与,全局视图通过内部消息将所有节点的运行信息统一展示,并可以通过不同的过滤条件来定位相关的问题。每行显示一个服务器进程,同时详细描述与之关联的用户会话和查询,可以有效帮助用户分析排查当前运行的 SQL 任务以及异常问题。

全局视图表介绍

全局视图 pg_stat_cluster_activity 由以下各列构成:



注意事项

在使用全局视图的时候,以下问题需要注意:

  • 全局对内存表列以及系统视图进行了修改,因此需要修改每个节点的- postgresql.conf,然后重启集群,extension 才可生效。

  • 只有 superuser 用户或者是正在报告的进程的拥有者,才可以使用 pg_stat_activity 视图。

使用场景

本节针对一些特定场景介绍全局视图的使用方法,用户可不局限于以下的介绍。

查看连接信息

通过下述 SQL 确认当前的连接用户和对应的连接机器。

SELECT datname,usename,client_addr,client_portFROM pg_stat_cluster_activitywhere client_addr is not null;
复制代码



查看 SQL 运行信息

获取当前用户执行 SQL 信息。

SELECT queryid, nodename, datname,pid,queryFROM pg_stat_cluster_activitywhere query <> ''order by queryid, nodename;
复制代码


可以得到如下结果:

其中同一个 Query 在不同的 CN 以及 DN 上有相同的 queryid,其中列 query 可以表示 CN 或 DN 上正在执行的查询或者查询片段。



查看耗时较长的查询

查看当前运行中的耗时较长的 SQL 语句。

select current_timestamp - query_start as runtime,queryid, nodename, datname, state, queryfrom pg_stat_cluster_activitywhere state != 'idle' and query <> ''order by runtime desc;
复制代码


其中 runtime 表示查询执行的时间,可以根据目前查询执行的时间进行排序,找出目前执行时间最长的查询。



Query 执行过程中挂起

Query 在执行过程中挂起,定位出现问题的节点信息。利用前面的办法定位到挂起的 Query 的 PID,然后利用下面的 Query,把有问题 Query 的 PID 填到?处。

select queryid, nodename, datid AS datid, datname AS datname, pid,wait_event_type, wait_event, wait_event_info, local_fid, state, queryfrom pg_stat_cluster_activitywhere queryid = (select queryidfrom pg_stat_cluster_activitywhere pid= ? )
复制代码



第一行表示 cn001 的数据,wait_event_type 为 FN 说明 cn001 在等待 FN 类型 event,wait_event 为 FnRecieveData 表 cn001 在等待数据,wait_event_info 为 40,说明在等待 FID40 的数据;

第三行表示 dn001 的数据,dn001 的 local_fid 是 40,且 wait_event_type 以及 wait_event 为空,说明 dn001 没有任何事件等待,所以 dn001 可能为有问题的节点。

第四行表示 dn002 的数据,dn002 等待事件为 ClientRead 说明已经完成 Fragment 的执行正在等待新的命令,所以为正常节点。

用户头像

还未添加个人签名 2020-06-19 加入

欢迎关注,邀您一起探索数据的无限潜能!

评论

发布
暂无评论
打造次世代分析型数据库(五):复杂查询分析工具_数据库_腾讯云大数据_InfoQ写作社区