了解 PostgreSQL 磁盘使用情况

rhy*_*yek 6 postgresql disk-space-utilization

我正在使用 9.1 并且dpi在数据库中调用了一个表,其中 UTF-8 编码当前位于 18,628 行。那里有一TEXT列叫做fotoB64 字符串,代表一个唯一的图像文件。

我想弄清楚一行需要多少磁盘空间。有18050行与非NULL的价值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
Run Code Online (Sandbox Code Playgroud)

跑步

select pg_size_pretty(pg_relation_size(c.oid)) AS "size"
from pg_class c
where relname = 'dpi';
Run Code Online (Sandbox Code Playgroud)

我得到以下信息:

  size
---------
 5752 kB
(1 row)
Run Code Online (Sandbox Code Playgroud)

这里到底发生了什么?为什么这张桌子这么小?

编辑:另外,我检查了/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;
Run Code Online (Sandbox Code Playgroud)

产量:

           relation            |  size
-------------------------------+---------
 pg_toast.pg_toast_17048       | 501 MB
 public.dpi                    | 5752 kB
 pg_toast.pg_toast_17048_index | 5752 kB
(3 rows)
Run Code Online (Sandbox Code Playgroud)

编辑 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

Oli*_*r S 6

Postgresql 没有“blob 类型”。发生的事情是它自动将“大列”(即大于 1 页,8k )切片到“toast”表中。

在此处查看有关 postgres 磁盘使用情况的信息

在这里查看postgresql 管理功能,您将了解到您感兴趣的功能是:pg_table_sizepg_total_relation_size

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