#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.