了解PostgreSQL磁盘使用情况
我正在使用9.1并在数据库中有一个名为dpi的表,其中UTF-8编码目前位于18,628行.那里有一个名为foto的TEXT列,它包含代表唯一图像文件的B64字符串.
我想弄清楚一行需要多少磁盘空间. foto有18050行,非NULL值,所有这些行的长度()为87384. 我没有得到的是这个.从pgstattuple(‘dpi’)运行select *;返回: -[ 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: 即便如此,每行28 KiB似乎异常小.仅一个foto值应为85 KiB(假设只有1个字节的字符). 答案是PostgreSQL TOAST机制默认情况下不仅会分解非常大的列,具体取决于它实际上首先尝试压缩它们的数据类型.很简约. 资料来源:http://www.postgresql.org/docs/9.1/static/storage-toast.html
Postgresql没有“blobs类型”.会发生什么,它会自动将“大列”(即大于1页,8k)切成“吐司”表.
看这里informations on disk usage on postgres 在这里你将了解到你感兴趣的函数是:pg_table_size和pg_total_relation_size 两者都考虑到了吐司空间.第一个不计算索引空间,第二个不计算. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |