1. 程式人生 > >監控PostgreSQL的磁碟使用

監控PostgreSQL的磁碟使用

每個表都有一個主要的堆磁碟檔案,大多數資料都儲存在其中。如果一個表有著可能會很寬(尺寸大)的列, 則另外還有一個TOAST檔案與這個表相關聯, 它用於儲存因為太寬而不能儲存在主表裡面的值。如果有這個附屬檔案,那麼TOAST表上會有一個可用的索引。 當然,同時還可能有索引和基表關聯。每個表和索引都存放在單獨的磁碟檔案裡,如果檔案超過 1G 位元組,甚至可能多於一個檔案。 你可以以三種方式監視磁碟空間:使用SQL函式、使用oid2name模組或者人工觀察系統目錄。SQL函式是最容易使用的方法,同時也是通常推薦的方法。 在一個最近清理過或者分析過的資料庫上使用psql,你可以發出查詢來檢視任意表的磁碟用量:

postgres=# SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'ctetest';
 pg_relation_filepath | relpages 
----------------------+----------
 base/12330/41502     |     8334
(1 row)

每個頁通常都是 8K 位元組(記住,relpages只會由VACUUM、ANALYZE和少數幾個 DDL 命令如CREATE INDEX所更新)。 顯示TOAST表使用的空間:

postgres=# SELECT relname, relpages                                      
           FROM pg_class,
                (SELECT reltoastrelid
                 FROM pg_class
                 WHERE relname = 'ctetest') AS ss
           WHERE oid = ss.reltoastrelid OR
                 oid = (SELECT indexrelid
                        FROM pg_index
                        WHERE indrelid = ss.reltoastrelid)
           ORDER BY relname;
       relname        | relpages 
----------------------+----------
 pg_toast_41502       |        0
 pg_toast_41502_index |        1
(2 rows)

顯示索引的尺寸:

postgres=# SELECT c2.relname, c2.relpages                       
           FROM pg_class c, pg_class c2, pg_index i
           WHERE c.relname = 'ctetest' AND
                 c.oid = i.indrelid AND
                 c2.oid = i.indexrelid
           ORDER BY c2.relname;
    relname     | relpages 
----------------+----------
 ctetest_id_idx |     2198
(1 row)

找出最大的表和索引:

postgres=# SELECT relname, relpages
           FROM pg_class
           ORDER BY relpages DESC;
                  relname                  | relpages 
-------------------------------------------+----------
 test02                                    |    39216
 ctetest                                   |     8334
 foo                                       |     4425

By Kalath