PostgreSQL 判斷磁盤用量

2021-09-01 17:25 更新

每個表都有一個主要的堆磁盤文件,大多數(shù)數(shù)據(jù)都存儲在其中。如果一個表有著可能會很寬(尺寸大)的列, 則另外還有一個TOAST文件與這個表相關(guān)聯(lián), 它用于存儲因為太寬而不能存儲在主表里面的值(參閱第 68.2 節(jié))。如果有這個附屬文件,那么TOAST表上會有一個可用的索引。 當(dāng)然,同時還可能有索引和基表關(guān)聯(lián)。每個表和索引都存放在單獨的磁盤文件里 — 如果文件超過 1G 字節(jié),甚至可能多于一個文件。這些文件的命名原則在第 68.1 節(jié)中描述。

你可以以三種方式監(jiān)視磁盤空間:使用表 9.90中列出的SQL函數(shù)、使用oid2name模塊或者人工觀察系統(tǒng)目錄。SQL函數(shù)是最容易使用的方法,同時也是我們通常推薦的方法。本節(jié)剩余的部分將展示如何通過觀察系統(tǒng)目錄來監(jiān)視磁盤空間。

在一個最近清理過或者分析過的數(shù)據(jù)庫上使用psql,你可以發(fā)出查詢來查看任意表的磁盤用量:

SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer';

 pg_relation_filepath | relpages
----------------------+----------
 base/16384/16806     |       60
(1 row)

每個頁通常都是 8K 字節(jié)(記住,relpages只會由VACUUMANALYZE和少數(shù)幾個 DDL 命令如CREATE INDEX所更新)。如果你想直接檢查表的磁盤文件,那么文件路徑名應(yīng)該有用。

要顯示TOAST表使用的空間,我們可以使用一個類似下面這樣的查詢:

SELECT relname, relpages
FROM pg_class,
     (SELECT reltoastrelid
      FROM pg_class
      WHERE relname = 'customer') AS ss
WHERE oid = ss.reltoastrelid OR
      oid = (SELECT indexrelid
             FROM pg_index
             WHERE indrelid = 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_index |       26

我們很容易用下面的信息找出最大的表和索引:

SELECT relname, relpages
FROM pg_class
ORDER BY relpages DESC;

       relname        | relpages
----------------------+----------
 bigtable             |     3290
 customer             |     3144


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號