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


作者介绍
shuobjli(李硕),腾讯云数据库专家工程师,主要研究方向为数据库优化器、执行器、索引管理等,目前主要负责 CDW PG 优化器方面的研发工作。
背景介绍
本文主要介绍 CDW PG 全局视图工具的最佳实践。CDW PG 作为分布式数据库,执行 query 需要多个 CN 和 DN 交互运行,对于复杂查询,甚至会出现多层调用的情况。CN 和 DN 出现生产者以及消费者之间的依赖关系,问题相对比较复杂,例如死锁、程序挂起、节点报错等情况。在没有有力定位工具的情况,很难在运维过程中在短时间内定位相关问题。本工具适用于以下场景:
定位问题 Query 所在的 CN 节点
通过错误 ID 定位对应的 DN 节点
出现进程挂起的状况,定位相关的问题节点
总体介绍
CDW PG 在运行过程中有多个节点参与,全局视图通过内部消息将所有节点的运行信息统一展示,并可以通过不同的过滤条件来定位相关的问题。每行显示一个服务器进程,同时详细描述与之关联的用户会话和查询,可以有效帮助用户分析排查当前运行的 SQL 任务以及异常问题。
全局视图表介绍
全局视图 pg_stat_cluster_activity 由以下各列构成:

注意事项
在使用全局视图的时候,以下问题需要注意:
全局对内存表列以及系统视图进行了修改,因此需要修改每个节点的- postgresql.conf,然后重启集群,extension 才可生效。
只有 superuser 用户或者是正在报告的进程的拥有者,才可以使用 pg_stat_activity 视图。
使用场景
本节针对一些特定场景介绍全局视图的使用方法,用户可不局限于以下的介绍。
查看连接信息
通过下述 SQL 确认当前的连接用户和对应的连接机器。

查看 SQL 运行信息
获取当前用户执行 SQL 信息。
可以得到如下结果:
其中同一个 Query 在不同的 CN 以及 DN 上有相同的 queryid,其中列 query 可以表示 CN 或 DN 上正在执行的查询或者查询片段。

查看耗时较长的查询
查看当前运行中的耗时较长的 SQL 语句。
其中 runtime 表示查询执行的时间,可以根据目前查询执行的时间进行排序,找出目前执行时间最长的查询。

Query 执行过程中挂起
Query 在执行过程中挂起,定位出现问题的节点信息。利用前面的办法定位到挂起的 Query 的 PID,然后利用下面的 Query,把有问题 Query 的 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 的执行正在等待新的命令,所以为正常节点。
评论