PostgreSQL pgstattuple

2021-09-16 17:06 更新
F.30.1. 函數(shù)

pgstattuple模塊提供多種函數(shù)來獲得元組層的統(tǒng)計(jì)信息。

由于這些函數(shù)返回詳細(xì)的頁面級信息,因此默認(rèn)訪問權(quán)限是受限制的。 默認(rèn)情況下,只有角色pg_stat_scan_tables具有EXECUTE特權(quán)。 超級用戶當(dāng)然可以繞過這個限制。擴(kuò)展程序安裝后,用戶可以發(fā)送GRANT命令來更改函數(shù)的權(quán)限以允許其他用戶來執(zhí)行它們。但是,最好將這些用戶添加到pg_stat_scan_tables角色。

F.30.1. 函數(shù)

pgstattuple(regclass) 返回 record

pgstattuple返回一個關(guān)系的物理長度、死亡元組的百分比以及其他信息。這可以幫助用戶決定是否需要清理。參數(shù)是目標(biāo)關(guān)系的名稱(可以有選擇地用模式限定)或者 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.22中描述了輸出列。

表 F.22. pgstattuple 輸出列

類型 描述
table_len bigint 物理關(guān)系長度,以字節(jié)計(jì)
tuple_count bigint 存活元組的數(shù)量
tuple_len bigint 存活元組的總長度,以字節(jié)計(jì)
tuple_percent float8 存活元組的百分比
dead_tuple_count bigint 死亡元組的數(shù)量
dead_tuple_len bigint 死亡元組的總長度,以字節(jié)計(jì)
dead_tuple_percent float8 死亡元組的百分比
free_space bigint 空閑空間總量,以字節(jié)計(jì)
free_percent float8 空閑空間的百分比

注意

table_len將總是比tuple_len、 dead_tuple_lenfree_space的和要大。 不同之處在于固定的頁面開銷,每頁指向元組的指針表和填充以確保元組正確對齊。

pgstattuple只要求在關(guān)系上的一個讀鎖。因此結(jié)果不能反映一個即時快照,并發(fā)更新將影響結(jié)果。

如果HeapTupleSatisfiesDirty返回假,pgstattuple就判定一個元組是死亡的。

pgstattuple(text) 返回 record

pgstattuple(regclass)相同,只不過通過 TEXT 指定目標(biāo)關(guān)系。這個函數(shù)只是為了向后兼容而保留,在未來的發(fā)布中將會被廢除。

pgstatindex(regclass) 返回 record

pgstatindex返回一個記錄顯示有關(guān)一個 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 以字節(jié)計(jì)的索引總尺寸
root_block_no bigint 根頁的位置(如果沒有則為零)
internal_pages bigint 內(nèi)部(上層)頁面的數(shù)量
leaf_pages bigint 葉子頁的數(shù)量
empty_pages bigint 空頁的數(shù)量
deleted_pages bigint 刪除頁的數(shù)量
avg_leaf_density float8 葉子頁的平均密度
leaf_fragmentation float8 葉子頁碎片

報(bào)告的index_size通常對應(yīng)于internal_pages + leaf_pages + empty_pages + deleted_pages加一,因?yàn)樗€包括索引的元頁。

對于pgstattuple,結(jié)果是一頁一頁累計(jì)的并且不要期望結(jié)果會表示整個索引的一個即時快照。

pgstatindex(text) returns record

pgstatindex(regclass)相同,只不過通過 TEXT 指定目標(biāo)索引。這個函數(shù)只是為了向后兼容而保留,在未來的某個發(fā)布中將會被廢除。

pgstatginindex(regclass) 返回 record

pgstatginindex返回一個記錄顯示有關(guān)一個 GIN 索引的信息。例如:

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

輸出列是:

類型 描述
version integer GIN 版本號
pending_pages integer 待處理列表中的頁面數(shù)
pending_tuples bigint 待處理列表中的元組數(shù)

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 存儲桶頁面的數(shù)量
overflow_pages bigint 溢出頁面的數(shù)量
bitmap_pages bigint 位圖頁數(shù)
unused_pages bigint 未使用頁面的數(shù)量
live_items bigint 活元組的數(shù)量
dead_tuples bigint 死元組的數(shù)量
free_percent float 自由空間的百分比

pg_relpages(regclass) 返回 bigint

pg_relpages返回關(guān)系中的頁面數(shù)。

pg_relpages(text) returns bigint

pg_relpages(regclass)相同,只不過用 TEXT 來 指定目標(biāo)關(guān)系。這個函數(shù)只是為了向后兼容而保留,在未來的某個發(fā)布中將會被廢除。

pgstattuple_approx(regclass) returns record

pgstattuple_approxpgstattuple的一個更加快速的替代品,它返回近似的結(jié)果。參數(shù)是目標(biāo)關(guān)系的 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.23中描述。

鑒于pgstattuple總是執(zhí)行全表掃描并且返回存活和死亡元組的準(zhǔn)確計(jì)數(shù)、尺寸和空閑空間,pgstattuple_approx嘗試避免全表掃描并且返回死亡元組的準(zhǔn)確統(tǒng)計(jì)信息,以及存活元組和空閑空間的近似數(shù)量及尺寸。

這個函數(shù)通過根據(jù)可見性映射跳過只包含可見元組的頁面來實(shí)現(xiàn)這一目的(如果一個頁面對應(yīng)的 VM 位被設(shè)置,那么就說明它不含有死亡元組)。對于這樣的額頁面,它會從空閑空間映射中得到空閑空間值,并且假定該頁面上的剩余空間由存活元組占據(jù)。

對于不能被跳過的頁面,它會掃描每個元組,在合適的計(jì)數(shù)器中記錄它的存在以及尺寸,并且統(tǒng)計(jì)該頁面上的空閑空間。最后,它會基于已掃描的頁面和元組數(shù)量來估計(jì)存活元組的總數(shù)(采用與 VACUUM 估計(jì) pg_class.reltuples 時相同的方法)。

表 F.23. pgstattuple_approx輸出列

類型 描述
table_len bigint 以字節(jié)計(jì)的物理關(guān)系長度(準(zhǔn)確)
scanned_percent float8 已掃描表的百分比
approx_tuple_count bigint 存活元組的數(shù)量(估計(jì))
approx_tuple_len bigint 以字節(jié)計(jì)的存活元組總長度(估計(jì))
approx_tuple_percent float8 存活元組的百分比
dead_tuple_count bigint 死亡元組的數(shù)量(準(zhǔn)確)
dead_tuple_len bigint 以字節(jié)計(jì)的死亡元組總長度(準(zhǔn)確)
dead_tuple_percent float8 死亡元組的百分比
approx_free_space bigint 以字節(jié)計(jì)的總空閑空間(估計(jì))
approx_free_percent float8 空閑空間的百分比

在上述的輸出中,空閑空間數(shù)字可能不完全匹配pgstattuple的輸出,這是因?yàn)榭臻e空間映射會給出一個準(zhǔn)確的數(shù)字,但是這個數(shù)字不能保證是一個準(zhǔn)確的字節(jié)數(shù)。

 


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號