每一個表都有一個主堆的磁盤文件,大多數數據都存儲在這裏。若是一個表有着可能會很長的字段, 則另外還有一個TOAST文件與這個表相關聯, 用於存儲由於數值太長而不能存儲在主表裏面的數據(參閱 Section 50.2)。 若是有這個擴展表,那麼表上會有一個TOAST索引。 固然,同時還可能有索引和基表關聯。 每一個表和索引都存放在單獨的磁盤文件裏 — 若是文件超過一吉,甚至可能多於一個文件。 這些文件的命名原則在 Section 50.1 裏描述。php
你能夠從三個地方監視磁盤空間:從 psql 裏使用 VACUUM 的信息,從 psql 裏使用 contrib/dbsize 裏面的工具,以及在命令行上使用 contrib/oid2name 裏面的工具。若是 psql 和任何最近剛剛清理(或者分析過)的數據庫進行聯接, 那麼咱們能夠用查詢來查看任意表的磁盤使用:html
SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer'; relfilenode | relpages -------------+---------- 16806 | 60 (1 row)
每一個頁一般都是 8 K字節。(記住,relpages只是由 VACUUM, ANALYZE 和幾個 DDL 命令,好比CREATE INDEX 所更新。) 若是你想直接檢查表的磁盤文件,那麼 relfilenode 應該有用。node
要顯示 TOAST 的表使用的空間,咱們能夠使用一個相似下面這樣的查詢:sql
SELECT relname, relpages FROM pg_class, (SELECT reltoastrelid FROM pg_class WHERE relname = 'customer') ss WHERE oid = ss.reltoastrelid OR oid = (SELECT reltoastidxid FROM pg_class WHERE oid = ss.reltoastrelid) ORDER BY relname; relname | relpages ----------------------+---------- pg_toast_16806 | 0 pg_toast_16806_index | 1
你也能夠很容易地顯示索引的用量:數據庫
SELECT c2.relname, c2.relpages FROM pg_class c, pg_class c2, pg_index i WHERE c.relname = 'customer' AND c.oid = i.indrelid AND c2.oid = i.indexrelid ORDER BY c2.relname; relname | relpages ----------------------+---------- customer_id_indexdex | 26
咱們很容易用下面的信息找出最大的表和索引:函數
SELECT relname, relpages FROM pg_class ORDER BY relpages DESC; relname | relpages ----------------------+---------- bigtable | 3290 customer | 3144
contrib/dbsize 向咱們的數據庫裏裝載一些函數,這些函數 容許咱們在 psql 裏找出一個表或者一個數據庫的大小,並且不用 VACUUM或者 ANALYZE。工具
你也能夠使用 oid2name 顯示磁盤用量。參閱 該目錄中的 README.oid2name 獲取例子。它包括一個爲每一個 數據庫顯示磁盤用量的腳本spa