我使用的是9.1,在数据库中有一个名为dpi的表,其中的UTF-8编码目前位于18,628行。其中有一个名为TEXT的foto列,它包含表示唯一图像文件的B64字符串。
我想弄清楚一行占用多少磁盘空间。对于NULL,有18050行具有非foto值,而对于所有行,length()都是87384。
我不明白的是这个。运行select * from pgstattuple('dpi');返回:
-[ RECORD 1 ]------+--------
table_len | 5890048
tuple_count | 18628
tuple_len | 5656063
tuple_percent | 96.03
dead_tuple_count | 0
dead_tuple_len | 0
dead_tuple_percent | 0
free_space | 92752
free_percent | 1.57正在运行
select pg_size_pretty(pg_relation_size(c.oid)) AS "size"
from pg_class c
where relname = 'dpi';我得到以下信息:
size
---------
5752 kB
(1 row)这到底是怎么回事?这张桌子怎么这么小?
编辑:此外,我检查了/var/lib/postgresql/9.1/main,它的大小为574.5MiB。跑步:
SELECT nspname || '.' || relname AS "relation",
pg_size_pretty(pg_relation_size(C.oid)) AS "size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_relation_size(C.oid) DESC
LIMIT 3;产量:
relation | size
-------------------------------+---------
pg_toast.pg_toast_17048 | 501 MB
public.dpi | 5752 kB
pg_toast.pg_toast_17048_index | 5752 kB
(3 rows)编辑2:使用select pg_total_relation_size('dpi');获取539262976字节。这是否意味着我可以除以18628,这将给我一个平均的每行大小(28 KiB)?每一行的大小会随着时间的推移而变化(因为索引或类似的原因)吗?
即使如此,每行28 KiB似乎非常小。仅一个foto值就应该是85 KiB (假设只有1字节字符)。
答案是,默认情况下,PostgreSQL吐司机制不仅会分解非常大的列,这取决于它实际上试图首先压缩它们的数据类型。相当整洁。
来源:http://www.postgresql.org/docs/9.1/static/storage-toast.html
发布于 2014-03-26 20:07:09
Postgresql没有"blobs类型“。它会自动将“大列”(大于1页,8k )分割成“敬酒”表。
对于postgresql管理功能,您将了解到您感兴趣的函数是:pg_table_size和pg_total_relation_size
两者都考虑到吐司空间。第一个不计算索引空间,第二个不计算索引空间。
https://serverfault.com/questions/584753
复制相似问题