本章討論如何觀察PostgreSQL資料庫系統的硬碟使用情況。 在目前的版本裡,資料庫管理員對硬碟儲存的布局沒有太多的 控制,因此本節主要是提示性的資訊,並且給你一些如何用操作 系統的工具管理硬碟儲存的概念。
每個表都有一個主堆的硬碟文件,大多數資料都儲存在這裡。要儲存 長的欄位值,則另外還有一個TOAST文件與這個表相關聯, 其名字是基於該表的OID(實際上是pg_class.relfilenode), 以及一個在TOAST表上的索引。同時還可能有索引和這個 基表關聯。
你可以從三個地方監視硬碟空間:從 psql 裡使用 VACUUM 的資訊,從 psql 裡使用 contrib/dbsize,以及在命令行上使用 contrib/oid2name。如果 psql 和任何最近剛剛清理(或者分析過)的資料庫進行連結, 那麼我們可以用查詢來查看任意表的硬碟使用:
play=# SELECT relfilenode, relpages
play-# FROM pg_class
play-# WHERE relname = 'customer';
relfilenode | relpages
-------------+----------
16806 | 60
(1 row)
每個頁面通常都是 8k 字節。(記住,relpages 只是由 VACUUM 和 ANALYZE 更新。)要顯示 TOAST 的表使用的空間,我們可以使用一個基於上面的堆 relfilenode 的查詢:
play=# SELECT relname, relpages
play-# FROM pg_class
play-# WHERE relname = 'pg_toast_16806' OR
play-# relname = 'pg_toast_16806_index'
play-# ORDER BY relname;
relname | relpages
----------------------+----------
pg_toast_16806 | 0
pg_toast_16806_index | 1
你也可以很容易地顯示索引的用量:
play=# SELECT c2.relname, c2.relpages
play-# FROM pg_class c, pg_class c2, pg_index i
play-# WHERE c.relname = 'customer' AND
play-# c.oid = i.indrelid AND
play-# c2.oid = i.indexrelid
play-# ORDER BY c2.relname;
relname | relpages
----------------------+----------
customer_id_indexdex | 26
我們很容易用 psql 找出最大的文件:
play=# SELECT relname, relpages
play-# FROM pg_class
play-# ORDER BY relpages DESC;
relname | relpages
----------------------+----------
bigtable | 3290
customer | 3144
contrib/dbsize 向我們的資料庫裡裝載一些函數,這些函數 允許我們在 psql 裡找出一個表或者一個資料庫的大小,而且不用 VACUUM/ANALYZE。
你也可以使用 oid2name 顯示硬碟用量。參閱 README.oid2name 獲取範例。它包括一個為每個 資料庫顯示硬碟用量的腳本。