Запуск функции postgresql для каждой строки в другом select, возвращающем объединенный результат - PullRequest
0 голосов
/ 17 мая 2018

Я хотел бы выполнить следующий запрос в моей базе данных:

SELECT nspname || '.' || relname AS relation,
  pg_size_pretty(pg_total_relation_size(C.oid)) AS total_size_pretty, pg_total_relation_size(C.oid) AS total_size
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  AND C.relkind <> 'i'
  AND nspname !~ '^pg_toast'

Затем для каждой строки в результате выполнения:

SELECT pg_size_pretty(dead_tuple_len + free_space) AS recoverable_space_pretty, (dead_tuple_len + free_space) AS recoverable_space FROM extensions.pgstattuple(relation);

Как я могу сделать это в Postgresql, возвращаярезультат, объединяющий два, поэтому я для каждой строки получаю: relation, total_size_pretty, total_size, recoverable_space_pretty, recoverable_space?

БОНУС: Я также хотел бы вывести результат как CSV

1 Ответ

0 голосов
/ 17 мая 2018

Сочетание CTE и COPY должно составлять:

COPY (
WITH j AS (
SELECT nspname || '.' || relname AS relation,
  pg_size_pretty(pg_total_relation_size(C.oid)) AS total_size_pretty, pg_total_relation_size(C.oid) AS total_size
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  AND C.relkind <> 'i'
  AND nspname !~ '^pg_toast'
)
SELECT pg_size_pretty((pgstattuple(j.relation)).dead_tuple_len + (pgstattuple(j.relation)).free_space) AS recoverable_space_pretty, (
                      (pgstattuple(j.relation)).dead_tuple_len + (pgstattuple(j.relation)).free_space) AS recoverable_space 
FROM j
) TO STDOUT CSV HEADER;

запрос вернул данные копирования:

recoverable_space_pretty,recoverable_space
8104 bytes,8104
7508 bytes,7508
7992 bytes,7992
8044 bytes,8044
0 bytes,0
5068 bytes,5068
0 bytes,0
0 bytes,0
8104 bytes,8104
7724 bytes,7724
0 bytes,0
0 bytes,0
0 bytes,0

Примечание: Если вы можете позволить себе запись в файловой системе сервера базы данных, измените STDOUT на выбранный вами путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...