PostgreSQL选择查询结果大小

5

我在PostgreSQL数据库中有一张表,并且用一些限制条件进行了查询,现在我想知道这个查询占用了多少磁盘空间。我知道PostgreSQL有一个函数pg_total_relation_size可以给出某个表的大小,但是怎样才能找到“子表”的大小呢?

有什么建议吗?

我使用的是PostgreSQL 9.1。


一个选择语句没有“磁盘大小”,因为它不存储在任何地方。 - user330315
好的,那我需要先存储它才能得到大小吗?还有其他选择吗?我的意思是,我只想知道子表的大小… - golinko
你可以将其输出到文本文件中,以获得数据的原始大小的大致估计。 - user330315
我刚刚找到了以下替代方案:select sum(octet_length(temp.*::text)) from (select * from lesson) as temp。它可以正常工作,并以文本表示形式获取表的大小。 - golinko
1个回答

18

为了获得数据的大小,考虑到TOAST压缩等因素:

regress=> SELECT sum(pg_column_size(devices)) FROM devices WHERE country = 'US';
 sum 
-----
 105
(1 row)

为了获取磁盘存储所需的总量,包括块分配开销、头部等:

regress=> CREATE TEMPORARY TABLE query_out AS SELECT * FROM devices WHERE country = 'US';
SELECT 3
regress=> SELECT pg_total_relation_size('query_out');
 pg_total_relation_size 
------------------------
                  16384
(1 row)

为什么结果会有如此不同呢?因为后面的查询报告的是主表和TOAST表每个8K块的大小,而并不关心这些块大部分都是空的。

16384是什么意思?它是以KB还是字节为单位? - Mohd Anas
1
@CraigRinger 谢谢... 如果我想在一个查询中获取多个表的大小,你能告诉我需要做什么吗? - Mohd Anas
@MohdAnas 在 pg_class 上进行联接,或手动指定多个表名,或使用 VALUES 列表。就像任何其他类型的查询一样。 - Craig Ringer
@CraigRinger 当然,谢谢。 - Mohd Anas
@CraigRinger,这是我的问题,请看一下:http://stackoverflow.com/questions/27054654/get-the-size-of-multiple-tables-in-one-query-postgres - Mohd Anas
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接