Получить размер таблицы секционированной таблицы (Postgres 10+) - PullRequest
0 голосов
/ 28 февраля 2019

Я сталкивался с этим запросом на еженедельнике Postgres , который показывает таблицы, их размеры, размеры тостов и размеры индексов в байтах:

SELECT
  relname AS table_name,
  pg_size_pretty(pg_total_relation_size(relid)) AS total,
  pg_size_pretty(pg_relation_size(relid)) AS internal,
  pg_size_pretty(pg_table_size(relid) - pg_relation_size(relid)) AS external,
  pg_size_pretty(pg_indexes_size(relid)) AS indexes
FROM pg_catalog.pg_statio_user_tables 
ORDER BY pg_total_relation_size(relid) DESC;

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

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Следуя инструкциям @Laurenz Albe, я создал запрос, удовлетворяющий моим потребностям.Это позволит получить общую память для всех секционированных таблиц из конкретной базы данных.

SELECT
   pi.inhparent::regclass AS parent_table_name, 
   pg_size_pretty(sum(pg_total_relation_size(psu.relid))) AS total,
   pg_size_pretty(sum(pg_relation_size(psu.relid))) AS internal,
   pg_size_pretty(sum(pg_table_size(psu.relid) - pg_relation_size(psu.relid))) AS external, -- toast
   pg_size_pretty(sum(pg_indexes_size(psu.relid))) AS indexes
FROM pg_catalog.pg_statio_user_tables psu
   JOIN pg_class pc ON psu.relname = pc.relname
   JOIN pg_database pd ON pc.relowner = pd.datdba
   JOIN pg_inherits pi ON pi.inhrelid = pc.oid
WHERE pd.datname = :database_name
GROUP BY pi.inhparent
ORDER BY sum(pg_total_relation_size(psu.relid)) DESC;

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

0 голосов
/ 28 февраля 2019

Конечно, но вам нужно присоединиться к куче других таблиц каталога и использовать GROUP BY.

  • Атрибут relkind из каталога pg_class скажет вамесли отношение разделено (p) или нет (r).

  • В каталоге pg_inherits будет указано, какой раздел (inhrelid) принадлежит какой разделенной таблице(inhparent).

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

...