Нахождение размера гистограммы для данной таблицы PostgreSQL - PullRequest
0 голосов
/ 20 октября 2018

У меня есть таблица PostgreSQL с именем census.Я выполнил команду ANALYSE для таблицы, и статистика записана в pg_stats.

В этой pg_stats есть другие записи из других таблиц базы данных, как и следовало ожидать.

Однако я хотел знать, сколько места занято для хранения histogram_bounds для censusстол один.Есть ли хороший и быстрый способ для этого?

PS: я попытался сбросить таблицу pg_stats на диск, чтобы измерить память, используя

select * into copy_table from census where tablename='census';

Однако, это не удалось из-запсевдотип anyarray.

Есть ли здесь идеи?

1 Ответ

0 голосов
/ 20 октября 2018

В дальнейшем я использую таблицу pg_type и ее столбец typname для демонстрационных целей.Замените их именем таблицы и столбца, чтобы получить ответ по вашему делу (вы не сказали, какой столбец вас интересует).

Вы можете использовать функцию pg_column_size, чтобы получить размер any column:

SELECT pg_column_size(histogram_bounds)
FROM pg_stats
WHERE schemaname = 'pg_catalog'
  AND tablename = 'pg_type'
  AND attname = 'typname';

 pg_column_size 
----------------
           1269
(1 row)

Чтобы преобразовать anyarray в обычный массив, вы можете сначала привести его к text, а затем к нужному типу массива:

SELECT histogram_bounds::text::name[] FROM pg_stats ...

ЕслиВы измеряете размер этого преобразованного массива, и вы заметите, что он намного больше, чем результат выше.

Причина в том, что pg_column_size измеряет фактический размер на диске, а histogram_bounds достаточно большойхранится вне строки в таблице TOAST, где он будет сжат.Преобразованный массив не сжимается, поскольку он не сохраняется в таблице.

...