pgstattuple
模組提供各種函數來取得 Tuple 層級的統計資訊。
由於這些函數會傳回詳細的頁面層級資訊,因此預設會限制存取。 預設情況下,只有角色 pg_stat_scan_tables
具有 EXECUTE
權限。 超級使用者當然會略過此限制。 安裝擴充功能後,使用者可以發出 GRANT
命令來變更函數的權限,以允許其他人執行它們。 但是,最好將這些使用者新增至 pg_stat_scan_tables
角色。
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_len
、dead_tuple_len
和 free_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_approx
是 pgstattuple
的更快替代方案,可傳回近似結果。參數是目標關係的名稱或 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
輸出不完全匹配,因為可用空間映射給我們一個精確的數字,但不保證精確到位元組。
Tatsuo Ishii, Satoshi Nagayasu 和 Abhijit Menon-Sen
如果您在文件中看到任何不正確、與特定功能不符,或需要進一步澄清的內容,請使用此表單回報文件問題。