Как получить агрегированное количество строк для разделенных таблиц в citus postgres

#sql #database #postgresql #citus

Вопрос:

Требование состоит в том, чтобы получить сумму относительных значений для всех распределенных таблиц в базе данных Citus Postgres в определенном формате, который объясняется ниже.

Когда я выполняю приведенную ниже команду, запрос распространяется на работников, и в зависимости от количества сегментов на каждом работнике результаты извлекаются для каждой таблицы:

 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> <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}

Ответ №1:

Вы можете использовать run_command_on_shards запрос для всех сегментов таблицы. Таким образом, вы можете получить все относительные значения из фрагментов и объединить их позже в координаторе, чтобы получить нужный формат. Вы можете узнать больше об этой команде здесь, в официальной документации 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.