9.3 9.4 9.5 9.6 10 11
问题报告 纠错本页面

F.29. pgstattuple

pgstattuple模块提供多种函数来获得元组级别的统计信息。

F.29.1. 函数

pgstattuple(regclass) returns record

pgstattuple返回一个关系的物理长度、 "死的"元组的百分比以及其他信息。这可以帮助用户确定是否需要清理。 参数是目标关系的名称(可以有模式限定)或者 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-21中描述。

表 F-21. pgstattuple 输出字段

字段类型描述
table_lenbigint物理关系长度,以字节计
tuple_countbigint活的元组的数量
tuple_lenbigint活的元组的总长度,以字节计
tuple_percentfloat8活的元组的百分比
dead_tuple_countbigint死的元组的数量
dead_tuple_lenbigint死的元组的总长度,以字节计
dead_tuple_percentfloat8死的元组的百分比
free_spacebigint空闲空间总量,以字节计
free_percentfloat8空闲空间的百分比

pgstattuple只要求在关系上的一个读锁。 因此结果不能反映一个即时快照,并发更新将影响结果。

如果HeapTupleSatisfiesDirty返回假, pgstattuple就判定一个元组是"死的"

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

输出字段是:

字段类型描述
versionintegerB-树 版本号
tree_levelinteger根页的树级别
index_sizebigint总索引大小(以字节为单位)
root_block_nobigint根页面的位置(如果没有则为零)
internal_pagesbigint"内部"(上一级)页面的数量
leaf_pagesbigint叶子页面的数量
empty_pagesbigint空页面的数量
deleted_pagesbigint删除页面的数量
avg_leaf_densityfloat8叶子页面的平均密度
leaf_fragmentationfloat8叶子页面碎片

报告的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

输出字段是:

字段类型描述
versionintegerGIN 版本号
pending_pagesinteger待处理列表中的页面数
pending_tuplesbigint待处理列表中的元组数

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-22中描述。

pgstattuple总是执行全表扫描并返回活的和死的元组 (及其大小)和可用空间的精确计数,pgstattuple_approx 尝试避免全表扫描并返回精确的死元组统计数据以及活元组和自由空间的数量和大小的近似值。

它通过根据可见性映射跳过仅具有可见元组的页面(如果页面具有相应的VM位集, 则假定其不包含死元组)实现这点。对于这样的页面, 它从自由空间映射中导出可用空间值,并假设页面上的其余空间由活的元组占用。

对于不能跳过的页面,它会扫描每个元组,在适当的计数器中记录其存在和大小, 并加上页面上的可用空间。最后,它基于扫描的页面和元组的数量估计活的元组的总数 (以与VACUUM估计pg_class.reltuples相同的方式)。

表 F-22. pgstattuple_approx 输出字段

字段类型描述
table_lenbigint以字节为单位的物理关系长度(精确)
scanned_percentfloat8已扫描表的百分比
approx_tuple_countbigint活元组数(估计)
approx_tuple_lenbigint活的元组的总长度(以字节为单位)(估计)
approx_tuple_percentfloat8活元组的百分比
dead_tuple_countbigint死元组数(精确)
dead_tuple_lenbigint死元组的总长度(以字节为单位)(精确)
dead_tuple_percentfloat8死元组的百分比
approx_free_spacebigint总可用空间(以字节为单位)(估计)
approx_free_percentfloat8可用空间百分比

在上面的输出中,可用空间数字可能与pgstattuple 输出不完全匹配,因为自由空间映射给了我们一个确切的数字,但不能保证精确到字节。

F.29.2. 作者

Tatsuo Ishii、Satoshi Nagayasu和Abhijit Menon-Sen