?
This document uses PHP Chinese website manual Release
每個(gè)表都有一個(gè)主堆(primary heap)磁盤文件,大多數(shù)數(shù)據(jù)都存儲(chǔ)在這里。 如果一個(gè)表存在值可能會(huì)很長(zhǎng)的字段,則另外還有一個(gè)用于存儲(chǔ)因?yàn)閿?shù)值 太長(zhǎng)而不適合存儲(chǔ)在主表中的數(shù)據(jù)的TOAST文件(參閱Section 54.2)。如果存在這個(gè)擴(kuò)展表,那么將會(huì)同時(shí)存在 一個(gè)TOAST索引。當(dāng)然,同時(shí)還可能有索引和基表關(guān)聯(lián)。每 個(gè)表和索引都存放在單獨(dú)的磁盤文件里(超過(guò) 1GB 可能會(huì)被分割成多個(gè))。 這些文件的命名原則在Section 54.1里描述。
可以使用三種方法監(jiān)視磁盤空間:使用Table 9-58 中列出的SQL函數(shù)、使用contrib/oid2name中的工具或者使用系統(tǒng)目 錄中的手動(dòng)檢查。SQL函數(shù)是用起來(lái)最簡(jiǎn)單并且通常是被推薦使用的。 contrib/oid2name在Section F.19中被描述。 這部分的剩余部分展示了如何通過(guò)系統(tǒng)目錄檢查來(lái)做。
在最近剛剛清理(或者分析過(guò))的數(shù)據(jù)庫(kù)上使用psql的話, 可以使用查詢來(lái)查看任意表的磁盤使用:
SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer'; pg_relation_filepath | relpages ----------------------+---------- base/16384/16806 | 60 (1 row)
每個(gè)頁(yè)通常都是8K字節(jié)。(注意,relpages只被VACUUM, ANALYZE和幾個(gè)DDL命令(例如CREATE INDEX)更新。如果你想 直接檢查表的磁盤文件,那么可以關(guān)注文件的路徑名。
要顯示TOAST表使用的空間,我們可以使用一個(gè)類似下面這樣的查詢:
SELECT relname, relpages FROM pg_class, (SELECT reltoastrelid FROM pg_class WHERE relname = 'customer') AS 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