K.38. ltstattuple

K.38.1. 函数

ltstattuple 模块提供了各种函数来获取元组级别的统计信息。

由于这些函数返回详细的页面级别信息,因此默认情况下访问受到限制。 默认情况下,只有角色 pg_stat_scan_tables 具有 EXECUTE 权限。 当然,超级用户可以绕过这个限制。 安装扩展后,用户可以发出 GRANT 命令来更改函数的权限,以允许其他用户执行它们。 然而,将这些用户添加到 pg_stat_scan_tables 角色可能更可取。

K.38.1. 函数

pgstattuple(regclass) 返回 record

pgstattuple 返回一个关系的物理长度、dead 元组的百分比和其他信息。 这可能有助于用户确定是否需要进行 vacuum 操作。 参数是目标关系的名称(可选地包含模式限定符)或 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

输出的列在 Table K.51 中描述。

Table K.51.  pgstattuple 输出列

类型描述
table_len bigint 关系的物理长度(以字节为单位)
tuple_count bigint 存活元组的数量
tuple_len bigint 存活元组的总长度(以字节为单位)
tuple_percent float8 存活元组的百分比
dead_tuple_count bigint 死亡元组的数量
dead_tuple_len bigint 死亡元组的总长度(以字节为单位)
dead_tuple_percent float8 死亡元组的百分比
free_space bigint 总空闲空间(以字节为单位)
free_percent float8 空闲空间的百分比

Note

table_len 始终大于 tuple_lendead_tuple_lenfree_space 之和。 差额由固定的页开销、指向元组的每页指针表和填充所占据。

pgstattuple 只对关系获取读取锁。因此,结果不反映即时快照;并发更新将影响它们。

pgstattuple 判断一个元组是否为 dead,取决于 HeapTupleSatisfiesDirty 返回的结果是否为 false。

pgstattuple(text) 返回 record

这与 pgstattuple(regclass) 相同,只是目标关系以 TEXT 的形式指定。 此函数因向后兼容而保留,但将在某个未来版本中弃用。

pgstatindex(regclass) 返回 record

pgstatindex 返回一个记录,其中包含有关 B-tree 索引的信息。例如:

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 版本号
tree_level integer 根页的树级别
index_size bigint 索引的总大小(以字节为单位)
root_block_no bigint 根页的位置(如果没有,则为零)
internal_pages bigint 内部(上层)页的数量
leaf_pages bigint 叶子页的数量
empty_pages bigint 空页的数量
deleted_pages bigint 已删除页的数量
avg_leaf_density float8 叶子页的平均密度
leaf_fragmentation float8 叶子页的碎片化程度

报告的 index_size 通常比 internal_pages + leaf_pages + empty_pages + deleted_pages 所占的页数多一个,因为它还包括索引的元数据页。

pgstattuple 一样,结果是逐页累加的,不应该期望它们代表整个索引的即时快照。

pgstatindex(text) 返回 record

这与 pgstatindex(regclass) 相同,只是目标索引以 TEXT 的形式指定。 此函数因向后兼容而保留,但将在某个未来版本中弃用。

pgstatginindex(regclass) 返回 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) 返回 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 存活元组数
dead_tuples bigint 死亡元组数
free_percent float 可用空间的百分比

pg_relpages(regclass) 返回 bigint

pg_relpages 返回关系中的页数。

pg_relpages(text) 返回 bigint

这与 pg_relpages(regclass) 相同,只是将目标关系指定为 TEXT。此功能保留了向后兼容性,但将在将来的某个版本中被废弃。

pgstattuple_approx(regclass) 返回 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

输出列的描述在 Table K.52 中。

pgstattuple 总是执行全表扫描并返回活动和死亡元组(及其大小)以及可用空间的精确计数,而 pgstattuple_approx 尝试避免全表扫描并返回精确的死亡元组统计信息以及近似的存活元组数和大小和可用空间。

它通过跳过仅包含可见元组的页面(根据可见性映射)来实现此目的(如果页面设置了相应的 VM 位,则假定不包含死亡元组)。对于这些页面,它从空闲空间映射中获取空闲空间值,并假设页面上的其余空间被存活元组占据。

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

Table K.52.  pgstattuple_approx 输出列

列名类型描述
table_len bigint 物理关系的长度(以字节为单位)(精确值)
scanned_percent float8 表扫描的百分比
approx_tuple_count bigint 存活元组数量(估算值)
approx_tuple_len bigint 存活元组的总字节长度(估算值)
approx_tuple_percent float8 存活元组的百分比
dead_tuple_count bigint 死亡元组的数量(确切值)
dead_tuple_len bigint 死亡元组的总字节长度(确切值)
dead_tuple_percent float8 死亡元组的百分比
approx_free_space bigint 总空闲空间的字节大小(估算值)
approx_free_percent float8 空闲空间的百分比

在上面的输出中,空闲空间的数据可能无法完全匹配pgstattuple的输出结果,因为空闲空间映射提供了精确的数字,但不能保证以字节为单位的精度完全准确。