了解 PostgreSQL 磁碟使用情況
我正在使用 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
跑步
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”表。
在這裡對於postgresql 管理功能,您將了解到您感興趣的功能是:
pg_table_size
和pg_total_relation_size
兩者都考慮到吐司空間。第一個不計算索引空間,第二個計算。