支援的版本: 目前 (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.31. pgstattuple — 取得 Tuple 層級的統計資訊 #

pgstattuple 模組提供各種函數來取得 Tuple 層級的統計資訊。

由於這些函數會傳回詳細的頁面層級資訊,因此預設會限制存取。 預設情況下,只有角色 pg_stat_scan_tables 具有 EXECUTE 權限。 超級使用者當然會略過此限制。 安裝擴充功能後,使用者可以發出 GRANT 命令來變更函數的權限,以允許其他人執行它們。 但是,最好將這些使用者新增至 pg_stat_scan_tables 角色。

F.31.1. 函數 #

pgstattuple(regclass) returns record

pgstattuple 傳回關聯的實際長度、死亡 Tuple 的百分比和其他資訊。 這可能有助於使用者判斷是否需要 vacuum。 參數是目標關聯的名稱(可選擇包含 schema)或 OID。 例如

test=> SELECT * FROM pgstattuple('pg_catalog.pg_proc');
-[ RECORD 1 ]------+-------
table_len          | 458752
tuple_count        | 1470
tuple_len          | 438896
tuple_percent      | 95.67
dead_tuple_count   | 11
dead_tuple_len     | 3157
dead_tuple_percent | 0.69
free_space         | 8932
free_percent       | 1.95

輸出欄位在 表 F.23 中說明。

表 F.23. pgstattuple 輸出欄位

欄位 類型 描述
table_len bigint 實際關聯長度 (以位元組為單位)
tuple_count bigint 作用中 Tuple 的數量
tuple_len bigint 作用中 Tuple 的總長度 (以位元組為單位)
tuple_percent float8 作用中 Tuple 的百分比
dead_tuple_count bigint 死亡 Tuple 的數量
dead_tuple_len bigint 死亡 Tuple 的總長度 (以位元組為單位)
dead_tuple_percent float8 死亡 Tuple 的百分比
free_space bigint 可用空間總量 (以位元組為單位)
free_percent float8 可用空間的百分比

注意

table_len 永遠大於 tuple_lendead_tuple_lenfree_space 的總和。 差異是由固定頁面額外負荷、每頁 Tuple 指標表和填充所造成,以確保 Tuple 正確對齊。

pgstattuple 僅取得關聯的讀取鎖定。 因此,結果不會反映即時快照; 並行更新會影響它們。

如果 HeapTupleSatisfiesDirty 傳回 false,則 pgstattuple 會判斷 Tuple 為 死亡

pgstattuple(text) returns record

這與 pgstattuple(regclass) 相同,只是目標關聯指定為 TEXT。 到目前為止,保留此函數是為了向後相容性,並且會在未來的版本中棄用。

pgstatindex(regclass) returns record

pgstatindex 傳回一個記錄,顯示有關 B 樹索引的資訊。 例如

test=> SELECT * FROM pgstatindex('pg_cast_oid_index');
-[ RECORD 1 ]------+------
version            | 2
tree_level         | 0
index_size         | 16384
root_block_no      | 1
internal_pages     | 0
leaf_pages         | 1
empty_pages        | 0
deleted_pages      | 0
avg_leaf_density   | 54.27
leaf_fragmentation | 0

輸出欄位為

欄位 類型 描述
version integer B 樹版本號碼
tree_level integer 根頁面的樹狀結構層級
index_size bigint 索引總大小 (以位元組為單位)
root_block_no bigint 根頁面的位置(如果沒有則為零)
internal_pages bigint 內部(上層)頁面的數量
leaf_pages bigint Leaf 頁面的數量
empty_pages bigint 空白頁面的數量
deleted_pages bigint 已刪除頁面的數量
avg_leaf_density float8 Leaf 頁面的平均密度
leaf_fragmentation float8 Leaf 頁面碎片

回報的 index_size 通常會比 internal_pages + leaf_pages + empty_pages + deleted_pages 所佔的頁面多一頁,因為它也包含索引的中繼頁面。

pgstattuple 相同,結果是逐頁累積的,因此不應期望它代表整個索引的即時快照。

pgstatindex(text) returns record

這與 pgstatindex(regclass) 相同,只是目標索引指定為 TEXT。 到目前為止,保留此函數是為了向後相容性,並且會在未來的版本中棄用。

pgstatginindex(regclass) returns record

pgstatginindex 傳回一個記錄,顯示有關 GIN 索引的資訊。 例如

test=> SELECT * FROM pgstatginindex('test_gin_index');
-[ RECORD 1 ]--+--
version        | 1
pending_pages  | 0
pending_tuples | 0

輸出欄位為

欄位 類型 描述
version integer GIN 版本號
pending_pages (待處理頁面) integer 待處理清單中的頁面數量
pending_tuples (待處理元組) bigint 待處理清單中的元組數量
pgstathashindex(regclass) returns record

pgstathashindex 傳回一個記錄,顯示關於 HASH 索引的資訊。例如:

test=> select * from pgstathashindex('con_hash_index');
-[ RECORD 1 ]--+-----------------
version        | 4
bucket_pages   | 33081
overflow_pages | 0
bitmap_pages   | 1
unused_pages   | 32455
live_items     | 10204006
dead_items     | 0
free_percent   | 61.8005949100872

輸出欄位為

欄位 類型 描述
version integer HASH 版本號
bucket_pages (儲存桶頁面) bigint 儲存桶頁面的數量
overflow_pages (溢出頁面) bigint 溢出頁面的數量
bitmap_pages (位圖頁面) bigint 位圖頁面的數量
unused_pages (未使用頁面) bigint 未使用頁面的數量
live_items (存活項目) bigint 作用中 Tuple 的數量
dead_tuples (死亡元組) bigint 死亡 Tuple 的數量
free_percent 浮點數 可用空間的百分比
pg_relpages(regclass) returns bigint

pg_relpages 傳回關係中的頁面數量。

pg_relpages(text) returns bigint

這和 pg_relpages(regclass) 相同,只是目標關係指定為 TEXT。這個函數因為向後相容性而保留,並將在未來的版本中被棄用。

pgstattuple_approx(regclass) returns record

pgstattuple_approxpgstattuple 的更快替代方案,可傳回近似結果。參數是目標關係的名稱或 OID。例如:

test=> SELECT * FROM pgstattuple_approx('pg_catalog.pg_proc'::regclass);
-[ RECORD 1 ]--------+-------
table_len            | 573440
scanned_percent      | 2
approx_tuple_count   | 2740
approx_tuple_len     | 561210
approx_tuple_percent | 97.87
dead_tuple_count     | 0
dead_tuple_len       | 0
dead_tuple_percent   | 0
approx_free_space    | 11996
approx_free_percent  | 2.09

輸出欄位在表 F.24中描述。

雖然 pgstattuple 總是執行全表掃描,並傳回存活和死亡元組(及其大小)和可用空間的精確計數,但 pgstattuple_approx 嘗試避免全表掃描,並傳回精確的死亡元組統計資訊,以及存活元組和可用空間的數量和大小的近似值。

它透過跳過根據可見性映射(visibility map)只有可見元組的頁面來做到這一點(如果一個頁面設置了相應的 VM 位元,那麼它被認為不包含死亡元組)。對於這樣的頁面,它從可用空間映射(free space map)中取得可用空間值,並假設頁面上的其餘空間被存活元組佔用。

對於無法跳過的頁面,它掃描每個元組,將其存在和大小記錄在相應的計數器中,並加總頁面上的可用空間。最後,它根據掃描的頁面和元組的數量來估計存活元組的總數(以與 VACUUM 估計 pg_class.reltuples 相同的方式)。

表 F.24. pgstattuple_approx 輸出欄位

欄位 類型 描述
table_len bigint 以位元組為單位的實體關係長度(精確)
scanned_percent (掃描百分比) float8 掃描的表格百分比
approx_tuple_count (近似元組計數) bigint 存活元組的數量(估計)
approx_tuple_len (近似元組長度) bigint 以位元組為單位的存活元組總長度(估計)
approx_tuple_percent (近似元組百分比) float8 作用中 Tuple 的百分比
dead_tuple_count bigint 死亡元組的數量(精確)
dead_tuple_len bigint 以位元組為單位的死亡元組總長度(精確)
dead_tuple_percent float8 死亡 Tuple 的百分比
approx_free_space (近似可用空間) bigint 以位元組為單位的總可用空間(估計)
approx_free_percent (近似可用空間百分比) float8 可用空間的百分比

在上述輸出中,可用空間數字可能與 pgstattuple 輸出不完全匹配,因為可用空間映射給我們一個精確的數字,但不保證精確到位元組。

F.31.2. 作者 #

Tatsuo Ishii, Satoshi Nagayasu 和 Abhijit Menon-Sen

提交更正

如果您在文件中看到任何不正確、與特定功能不符,或需要進一步澄清的內容,請使用此表單回報文件問題。