Postgres: проверить дисковое пространство, занимаемое материализованным представлением?

14

Я знаю, как проверить размер индексов и таблиц в Postgres (я использую версию 9.4):

SELECT
   relname AS objectname,
   relkind AS objecttype,
   reltuples AS "#entries", pg_size_pretty(relpages::bigint*8*1024) AS size
   FROM pg_class
   WHERE relpages >= 8
   ORDER BY relpages DESC;

Но это не показывает материализованные взгляды. Как я могу проверить, сколько дискового пространства они занимают?

Ричард
источник

Ответы:

23

Это предполагает , что материализованные представления были relpages >= 8в pg_class, которые не должны быть. На самом деле он может быть пустым - еще не заполнен, что обозначено pg_class.relispopulated = FALSE. В этом случае соответствующий файл на диске имеет нулевой размер.

Попробуйте вместо этого:

SELECT relname   AS objectname
     , relkind   AS objecttype
     , reltuples AS entries
     , pg_size_pretty(pg_table_size(oid)) AS size  -- depending - see below
FROM   pg_class
WHERE  relkind IN ('r', 'i', 'm')
ORDER  BY pg_table_size(oid) DESC;

Где доступны типы :

r= обычная таблица,
i= индекс,
S= последовательность,
v= представление,
m= материализованное представление,
c= составной тип,
t= таблица TOAST,
f= внешняя таблица

Используйте одну из функций размера объекта базы данных, а не свою собственную. Имейте в виду, что «размер таблицы» можно определять по-разному. Детали:

Эрвин Брандштеттер
источник
1
Правильный ответ действительно. Обратите внимание, что порядок по размеру вводит в заблуждение, поскольку вы печатаете размер в удобочитаемой форме, что делает сортировку заказов лексикографически
Джек
@ Джек: Хороший вопрос. Я добавил более разумный ORDER BY.
Эрвин Брандштеттер