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()
函數允許從緩衝池中逐出給定緩衝區識別碼的區塊。 此函數的使用僅限於超級使用者。
pg_buffercache
檢視 #檢視公開的欄位定義如 表 F.14 所示。
表 F.14. pg_buffercache
欄位
欄位類型 說明 |
---|
ID,範圍為 1.. |
關聯的 Filenode 編號 |
關聯的表格空間 OID |
關聯的資料庫 OID |
關聯中的 Fork 編號;請參閱 |
關聯中的頁碼 |
頁面是否為髒頁? |
Clock-sweep 存取計數 |
釘選此緩衝區的後端數量 |
共用快取中的每個緩衝區都有一列。 未使用的緩衝區會顯示所有欄位為空值,但 bufferid
除外。 共用系統目錄會顯示為屬於資料庫零。
由於快取被所有資料庫共用,因此通常會有來自不屬於目前資料庫的關聯的頁面。這表示在某些列中,pg_class
可能沒有相符的聯結列,甚至可能存在不正確的聯結。如果您嘗試與 pg_class
聯結,建議將聯結限制為 reldatabase
等於目前資料庫的 OID 或零的列。
由於沒有取得緩衝區管理器鎖定來複製視窗將顯示的緩衝區狀態資料,因此存取 pg_buffercache
視窗對一般緩衝區活動的影響較小,但它無法提供所有緩衝區的一致結果集。 但是,我們確保每個緩衝區的資訊都是自我一致的。
pg_buffercache_summary()
函數 #函數所公開的欄位定義顯示在 表格 F.15 中。
表格 F.15. pg_buffercache_summary()
輸出欄位
欄位類型 說明 |
---|
已使用的共用緩衝區數量 |
未使用的共用緩衝區數量 |
已變更的共用緩衝區數量 |
已釘選的共用緩衝區數量 |
已使用的共用緩衝區的平均使用次數 |
pg_buffercache_summary()
函數傳回單一列,總結所有共用緩衝區的狀態。 pg_buffercache
視窗提供類似且更詳細的資訊,但 pg_buffercache_summary()
的成本顯著較低。
與 pg_buffercache
視窗一樣,pg_buffercache_summary()
不會取得緩衝區管理器鎖定。 因此,並行活動可能會導致結果出現輕微的不準確。
pg_buffercache_usage_counts()
函數 #函數所公開的欄位定義顯示在 表格 F.16 中。
表格 F.16. pg_buffercache_usage_counts()
輸出欄位
欄位類型 說明 |
---|
可能的緩衝區使用次數 |
具有該使用次數的緩衝區數量 |
具有該使用次數的已變更緩衝區數量 |
具有該使用次數的已釘選緩衝區數量 |
pg_buffercache_usage_counts()
函數傳回一組列,總結所有共用緩衝區的狀態,並依可能的使用次數值進行彙總。 pg_buffercache
視窗提供類似且更詳細的資訊,但 pg_buffercache_usage_counts()
的成本顯著較低。
與 pg_buffercache
視窗一樣,pg_buffercache_usage_counts()
不會取得緩衝區管理器鎖定。 因此,並行活動可能會導致結果出現輕微的不準確。
pg_buffercache_evict
函數 #pg_buffercache_evict()
函數接受緩衝區識別符,如 pg_buffercache
視窗的 bufferid
欄位所示。 如果成功,則傳回 true;如果緩衝區無效、因為它被釘選而無法移除,或者在嘗試寫出後又再次變更,則傳回 false。 由於並行活動可能隨時使緩衝區再次有效,因此結果在傳回時會立即過期。 此函數僅適用於開發人員測試。
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)
Mark Kirkwood <markir@paradise.net.nz>
設計建議:Neil Conway <neilc@samurai.com>
除錯建議:Tom Lane <tgl@sss.pgh.pa.us>
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用此表格回報文件問題。