问题描述
我在Postgressql服务器上具有Citus扩展名。我想通过协调器节点查看每个工作人员的pg_stat_statements
的统计信息。但是,没有任何列与协调员和工作人员的表相匹配。有人知道我该怎么做吗?
我也对Postgresql如何计算queryId感兴趣。
因此,协调器上的pg_stat_statements
表将显示如下内容:
userid | dbid | queryid | query | other statistics related columns
1 | 2 | 123 | SELECT * FROM a; | ...
虽然工作程序上的pg_stat_statements
表将显示类似以下内容:
userid | dbid | queryid | query | other statistics related columns
1 | 2 | 456 | SELECT * FROM a_shard1; | ...
1 | 2 | 789 | SELECT * FROM a_shard2; | ...
解决方法
借助pg_dist_partition和pg_dist_shard_placement表,可以将工作程序(分片)上的表名与协调器上的分布式表进行匹配。要匹配统计信息,您可以查看citus_stat_statements视图。
,(无法回答以上答案,因此请在此处添加我的答案)
您可以使用下面的查询来列出特定工作节点中特定表的分片的位置(请参阅WHERE子句中的最后三个过滤器)。
SELECT pg_dist_shard.shardid,pg_dist_node.nodename,pg_dist_node.nodeport
FROM pg_dist_shard,pg_dist_placement,pg_dist_node
WHERE pg_dist_placement.groupid = pg_dist_node.groupid AND
logicalrelid = '<distributedTableName>'::regclass AND
pg_dist_node.nodename = '<nodeName>' AND
pg_dist_node.nodeport = '<nodePort>';
然后,您可以在感兴趣的工作节点中执行以下查询,以查看Citus针对该工作节点中的特定分片执行的操作:
SELECT * FROM pg_stat_statements WHERE query LIKE '%_<shardId>%';