支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.25. pg_buffercache — 檢視 PostgreSQL 緩衝快取狀態 #

pg_buffercache 模組提供了一種即時檢查共用緩衝快取中發生情況的方法。 它還提供了一種低階方式,可以為了測試目的將資料從中逐出。

此模組提供 pg_buffercache_pages() 函數(封裝在 pg_buffercache 檢視中)、pg_buffercache_summary() 函數、pg_buffercache_usage_counts() 函數和 pg_buffercache_evict() 函數。

pg_buffercache_pages() 函數會傳回一組記錄,每列描述一個共用緩衝條目的狀態。pg_buffercache 檢視會封裝此函數,以便於使用。

pg_buffercache_summary() 函數會傳回單一列,摘要說明共用緩衝快取的狀態。

pg_buffercache_usage_counts() 函數會傳回一組記錄,每列描述具有給定使用計數的緩衝區數量。

依預設,以上函數的使用僅限於超級使用者和具有 pg_monitor 角色權限的角色。 可以使用 GRANT 授與其他人存取權。

pg_buffercache_evict() 函數允許從緩衝池中逐出給定緩衝區識別碼的區塊。 此函數的使用僅限於超級使用者。

F.25.1. pg_buffercache 檢視 #

檢視公開的欄位定義如 表 F.14 所示。

表 F.14. pg_buffercache 欄位

欄位類型

說明

bufferid integer

ID,範圍為 1..shared_buffers

relfilenode oid(參考 pg_class.relfilenode

關聯的 Filenode 編號

reltablespace oid(參考 pg_tablespace.oid

關聯的表格空間 OID

reldatabase oid(參考 pg_database.oid

關聯的資料庫 OID

relforknumber smallint

關聯中的 Fork 編號;請參閱 common/relpath.h

relblocknumber bigint

關聯中的頁碼

isdirty boolean

頁面是否為髒頁?

usagecount smallint

Clock-sweep 存取計數

pinning_backends integer

釘選此緩衝區的後端數量


共用快取中的每個緩衝區都有一列。 未使用的緩衝區會顯示所有欄位為空值,但 bufferid 除外。 共用系統目錄會顯示為屬於資料庫零。

由於快取被所有資料庫共用,因此通常會有來自不屬於目前資料庫的關聯的頁面。這表示在某些列中,pg_class 可能沒有相符的聯結列,甚至可能存在不正確的聯結。如果您嘗試與 pg_class 聯結,建議將聯結限制為 reldatabase 等於目前資料庫的 OID 或零的列。

由於沒有取得緩衝區管理器鎖定來複製視窗將顯示的緩衝區狀態資料,因此存取 pg_buffercache 視窗對一般緩衝區活動的影響較小,但它無法提供所有緩衝區的一致結果集。 但是,我們確保每個緩衝區的資訊都是自我一致的。

F.25.2. pg_buffercache_summary() 函數 #

函數所公開的欄位定義顯示在 表格 F.15 中。

表格 F.15. pg_buffercache_summary() 輸出欄位

欄位類型

說明

buffers_used int4

已使用的共用緩衝區數量

buffers_unused int4

未使用的共用緩衝區數量

buffers_dirty int4

已變更的共用緩衝區數量

buffers_pinned int4

已釘選的共用緩衝區數量

usagecount_avg float8

已使用的共用緩衝區的平均使用次數


pg_buffercache_summary() 函數傳回單一列,總結所有共用緩衝區的狀態。 pg_buffercache 視窗提供類似且更詳細的資訊,但 pg_buffercache_summary() 的成本顯著較低。

pg_buffercache 視窗一樣,pg_buffercache_summary() 不會取得緩衝區管理器鎖定。 因此,並行活動可能會導致結果出現輕微的不準確。

F.25.3. pg_buffercache_usage_counts() 函數 #

函數所公開的欄位定義顯示在 表格 F.16 中。

表格 F.16. pg_buffercache_usage_counts() 輸出欄位

欄位類型

說明

usage_count int4

可能的緩衝區使用次數

buffers int4

具有該使用次數的緩衝區數量

dirty int4

具有該使用次數的已變更緩衝區數量

pinned int4

具有該使用次數的已釘選緩衝區數量


pg_buffercache_usage_counts() 函數傳回一組列,總結所有共用緩衝區的狀態,並依可能的使用次數值進行彙總。 pg_buffercache 視窗提供類似且更詳細的資訊,但 pg_buffercache_usage_counts() 的成本顯著較低。

pg_buffercache 視窗一樣,pg_buffercache_usage_counts() 不會取得緩衝區管理器鎖定。 因此,並行活動可能會導致結果出現輕微的不準確。

F.25.4. pg_buffercache_evict 函數 #

pg_buffercache_evict() 函數接受緩衝區識別符,如 pg_buffercache 視窗的 bufferid 欄位所示。 如果成功,則傳回 true;如果緩衝區無效、因為它被釘選而無法移除,或者在嘗試寫出後又再次變更,則傳回 false。 由於並行活動可能隨時使緩衝區再次有效,因此結果在傳回時會立即過期。 此函數僅適用於開發人員測試。

F.25.5. 範例輸出 #

regression=# SELECT n.nspname, c.relname, count(*) AS buffers
             FROM pg_buffercache b JOIN pg_class c
             ON b.relfilenode = pg_relation_filenode(c.oid) AND
                b.reldatabase IN (0, (SELECT oid FROM pg_database
                                      WHERE datname = current_database()))
             JOIN pg_namespace n ON n.oid = c.relnamespace
             GROUP BY n.nspname, c.relname
             ORDER BY 3 DESC
             LIMIT 10;

  nspname   |        relname         | buffers
------------+------------------------+---------
 public     | delete_test_table      |     593
 public     | delete_test_table_pkey |     494
 pg_catalog | pg_attribute           |     472
 public     | quad_poly_tbl          |     353
 public     | tenk2                  |     349
 public     | tenk1                  |     349
 public     | gin_test_idx           |     306
 pg_catalog | pg_largeobject         |     206
 public     | gin_test_tbl           |     188
 public     | spgist_text_tbl        |     182
(10 rows)


regression=# SELECT * FROM pg_buffercache_summary();
 buffers_used | buffers_unused | buffers_dirty | buffers_pinned | usagecount_avg
--------------+----------------+---------------+----------------+----------------
          248 |        2096904 |            39 |              0 |       3.141129
(1 row)


regression=# SELECT * FROM pg_buffercache_usage_counts();
 usage_count | buffers | dirty | pinned
-------------+---------+-------+--------
           0 |   14650 |     0 |      0
           1 |    1436 |   671 |      0
           2 |     102 |    88 |      0
           3 |      23 |    21 |      0
           4 |       9 |     7 |      0
           5 |     164 |   106 |      0
(6 rows)

F.25.6. 作者 #

Mark Kirkwood

設計建議:Neil Conway

除錯建議:Tom Lane

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用此表格回報文件問題。