我有一个名为census
的PostgreSQL表。我已经在表上执行了ANALYSE
命令,并且统计信息记录在pg_stats
中。
这pg_stats
中还有其他数据库表中的其他条目。
但是,我想知道为histogram_bounds
表单独存储census
所消耗的空间。有什么好方法吗?
PS:我尝试将pg_stats
表转储到磁盘上以使用...来测量内存
select * into copy_table from census where tablename='census';
但是,由于伪类型anyarray
,它失败了。
那里有什么主意吗?
答案 0 :(得分:1)
以下,我将表pg_type
及其列typname
用于演示。将它们替换为表和列名称,以获取适合您情况的答案(您没有说出您对哪一列感兴趣)。
您可以使用pg_column_size
函数来获取any
列的大小:
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表中,该表将被压缩。转换后的数组未压缩,因为它没有存储在表中。