0

要求是获取 Citus Postgres 数据库中所有分布式表的 reltuples 总和,格式如下所述。

当我运行以下命令时,查询传播到工作人员,并根据每个工作人员的分片计数,为每个表获取结果:

SELECT result from run_command_on_workers( $cmd$ select json_agg(json_build_object(reltuples, relname)) from pg_class c join pg_catalog.pg_namespace n on n.oid=c.relnamespace where n.nspname not in ('citus', 'pg_toast', 'pg_catalog')

例如,结果由 <row_count, table_name_and_shardid {10, table_A_shardid0}, {20,table_A_shardid1}, {15, table_B_shardid0} >table_A_shardid0组成table_A_shardid1{30, table_A}

4

1 回答 1

1

您可以使用run_command_on_shards查询表的所有分片。通过这种方式,您可以从分片中获取所有 reltuple 值,并稍后在协调器中将它们组合以获得您想要的格式。您可以在Citus 官方文档中了解有关该命令的更多信息

目录表pg_dist_partition存储有关数据库中哪些表被分发的元数据。

使用我上面解释的内容,查询看起来像这样:

WITH shards_reltuples AS (
  SELECT logicalrelid,
  (run_command_on_shards(logicalrelid,
     $$ SELECT reltuples FROM pg_class WHERE oid = '%s'::regclass::oid $$ 
  )).result::real AS reltuples
  FROM pg_dist_partition)

SELECT logicalrelid, sum(reltuples) AS reltuples
FROM shards_reltuples GROUP BY logicalrelid;

您可以在它之上进行详细说明以获得所需的 json 格式。

于 2021-06-08T17:10:34.543 回答