了解PostgreSQL磁盘使用情况

前端之家收集整理的这篇文章主要介绍了了解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:
使用select pg_total_relation_size(‘dpi’);我得到539262976字节.这是否意味着我可以将其划分为18628年,那将给我一个平均每行大小(28 KiB)?每行的大小是否随时间而变化(因为索引或类似)?

即便如此,每行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

两者都考虑到了吐司空间.第一个不计算索引空间,第二个不计算.

猜你在找的Postgre SQL相关文章