Как я могу узнать размер каждого столбца в таблице 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;