Как я могу узнать размер каждого столбца в таблице Redshift?

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

3 ответа

Решение

Этот запрос даст вам размер (МБ) каждого столбца. Что он делает, так это подсчитывает количество блоков данных, где каждый блок использует 1 МБ, сгруппированный по таблице и столбцу.

SELECT
  TRIM(name) as table_name,
  TRIM(pg_attribute.attname) AS column_name,
  COUNT(1) AS size
FROM
  svv_diskusage JOIN pg_attribute ON
    svv_diskusage.col = pg_attribute.attnum-1 AND
    svv_diskusage.tbl = pg_attribute.attrelid
GROUP BY 1, 2

Вы можете прочитать больше о двух таблицах, участвующих в запросе, здесь: SVV_DISKUSAGE & pg_attribute.

Более точный размер таблицы будет включать скрытые системные столбцы deletexid, insertxid, oid (ROW ID), а также. Одна из моих таблиц использовала 752 блока без учета скрытых столбцов. Когда я добавил скрытые столбцы, он поднялся до 1063 блоков.

SELECT col, attname, COUNT(*) AS "mbs"
FROM stv_blocklist bl
JOIN stv_tbl_perm perm
  ON bl.tbl = perm.id AND bl.slice = perm.slice    
LEFT JOIN pg_attribute attr ON
  attr.attrelid = bl.tbl
  AND attr.attnum-1 = bl.col  
WHERE perm.name = '<TABLE-NAME>'  
GROUP BY col, attname
ORDER BY col;

Я придумал представление, которое содержит как размер таблицы, так и размер столбца - я считаю, что обычно нужно оптимизировать самые большие столбцы самых больших таблиц:

          with db_stats as (SELECT database, schema, "table", size, tbl_rows, table_id
                  FROM SVV_TABLE_INFO
                  order by size desc),
table_stats as (
SELECT
    tbl,
  TRIM(name) as table_name,
  TRIM(pg_attribute.attname) AS column_name,
  COUNT(1) AS size
FROM
  svv_diskusage JOIN pg_attribute ON
    svv_diskusage.col = pg_attribute.attnum-1 AND
    svv_diskusage.tbl = pg_attribute.attrelid
GROUP BY 1, 2, 3 )

select database, schema, "table", tbl_rows, column_name, db_stats.size as table_size, table_stats.size as column_size
from db_stats left join table_stats on db_stats.table_id = table_stats.tbl
order by db_stats.size desc, table_stats.size desc;
Другие вопросы по тегам