查找给定表PostgreSQL的直方图大小

时间:2018-10-20 01:10:15

标签: database postgresql database-design storage

我有一个名为census的PostgreSQL表。我已经在表上执行了ANALYSE命令,并且统计信息记录在pg_stats中。

pg_stats中还有其他数据库表中的其他条目。

但是,我想知道为histogram_bounds表单独存储census所消耗的空间。有什么好方法吗?

PS:我尝试将pg_stats表转储到磁盘上以使用...来测量内存

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

但是,由于伪类型anyarray,它失败了。

那里有什么主意吗?

1 个答案:

答案 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表中,该表将被压缩。转换后的数组未压缩,因为它没有存储在表中。