| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Fast Forward | Next | |
本章討論如何觀察PostgreSQL資料庫系統的磁盤使用情況。
每個資料表都有一個主堆的磁盤文件,大多數資料都儲存在這裡。如果一個資料表有著可能會很長的字串, 則另外還有一個TOAST文件與這個資料表相關聯, 用於儲存因為數值太長而不能儲存在主資料表裡面的資料(參閱 Section 49.2)。 如果有這個擴展資料表,那麼資料表上會有一個TOAST索引。 當然,同時還可能有索引和基資料表關聯。 每個資料表和索引都存放在單獨的磁盤文件裡 — 如果文件超過一吉,甚至可能多於一個文件。 這些文件的命名原則在 Section 49.1 裡描述。
您可以從三個地方監視磁盤空間:從 psql 裡使用 VACUUM 的訊息,從 psql 裡使用 contrib/dbsize 裡面的工具,以及在命令行上使用 contrib/oid2name 裡面的工具。如果 psql 和任何最近剛剛清理(或者分析過)的資料庫進行連線, 那麼我們可以用查詢來查看任意資料表的磁盤使用:
SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer';
relfilenode | relpages
-------------+----------
16806 | 60
(1 row)每個頁通常都是 8 K字元。(記住,relpages只是由 VACUUM, ANALYZE 和幾個 DDL 命令,比如CREATE INDEX 所更新。) 如果您想直接檢查資料表的磁盤文件,那麼 relfilenode 應該有用。
要顯示 TOAST 的資料表使用的空間,我們可以使用一個類似下面這樣的查詢:
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 獲取例子。它包括一個為每個 資料庫顯示磁盤用量的腳本。