rhy*_*yek 6 postgresql disk-space-utilization
我正在使用 9.1 并且dpi
在数据库中调用了一个表,其中 UTF-8 编码当前位于 18,628 行。那里有一TEXT
列叫做foto
B64 字符串,代表一个唯一的图像文件。
我想弄清楚一行需要多少磁盘空间。有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
Postgresql 没有“blob 类型”。发生的事情是它自动将“大列”(即大于 1 页,8k )切片到“toast”表中。
在这里查看postgresql 管理功能,您将了解到您感兴趣的功能是:pg_table_size
和pg_total_relation_size
两者都考虑到吐司空间。第一个不计算索引空间,第二个计算。
归档时间: |
|
查看次数: |
3548 次 |
最近记录: |