Postgresql

了解 PostgreSQL 磁碟使用情況

  • March 26, 2014

我正在使用 9.1 並dpi在數據庫中呼叫了一個表,該表使用 UTF-8 編碼目前位於 18,628 行。那裡有一個TEXT名為的列,foto其中包含代表唯一圖像文件的 B64 字元串。

我試圖弄清楚一行需要多少磁碟空間。有 18050 行具有非NULLfotolength()對於所有這些都是 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 TOAST 機制不僅會分解非常大的列,這取決於它實際上首先嘗試壓縮它們的數據類型。漂亮整齊。

來源:http ://www.postgresql.org/docs/9.1/static/storage-toast.html

Postgresql 沒有“blob 類型”。發生的情況是它自動將“大列”(即大於 1 頁,8k)切分成“toast”表。

在此處查看有關 postgres 磁碟使用情況的資訊

在這裡對於postgresql 管理功能,您將了解到您感興趣的功能是:pg_table_sizepg_total_relation_size

兩者都考慮到吐司空間。第一個不計算索引空間,第二個計算。

引用自:https://serverfault.com/questions/584753