# F.31.pgstattuple

F.31.1.功能F.31.2.作者

这个pgstattuple模块提供了各种获取元组级统计信息的功能。

因为这些函数返回详细的页面级信息,所以默认情况下访问受到限制。默认情况下,只有角色pg_统计_扫描_表格处决特权超级用户当然会绕过这个限制。安装扩展后,用户可能会发出授予用于更改函数权限以允许其他人执行的命令。但是,最好将这些用户添加到pg_统计_扫描_表格角色。

# F.31.1.功能

pgstattuple(regclass)返回记录

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.23.

表F.23.pgstattuple输出列

类型 描述
表_len 比基特 物理关系长度(字节)
元组计数 比基特 活动元组数
元组 比基特 活动元组的总长度(字节)
元组百分比 浮动8 活动元组的百分比
死元组计数 比基特 死元组数
死了 比基特 死元组的总长度(字节)
死亡百分比 浮动8 死亡元组的百分比
自由空间 比基特 总可用空间(字节)
免费百分比 浮动8 可用空间的百分比

# 笔记

这个表_len将始终大于元组, 死了自由空间这种差异是由固定的页面开销、指向元组的每页指针表以及确保元组正确对齐的填充来解释的。

pgstattuple仅获取关系上的读锁。因此,结果并不反映瞬时快照;同时更新会影响它们。

pgstattuple判断元组是“死”的,如果满满的满足感肮脏返回false。

pgstattuple(文本)返回记录

这和pgstattuple(regclass),但目标关系指定为文本。由于到目前为止的向后兼容性,这个函数被保留了下来,并且在将来的一些版本中将被弃用。

pgstatindex(regclass)返回记录

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

输出列包括:

类型 描述
版本 整数 B-树版本号
树级 整数 根页面的树级别
索引大小 比基特 总索引大小(字节)
根块号 比基特 根页面的位置(如果没有,则为零)
内部页面 比基特 “内部”(上层)页数
书页 比基特 页数
空页 比基特 空页数
删除的页面 比基特 已删除的页面数
平均叶密度 浮动8 页的平均密度
叶片碎裂 浮动8 页碎片

据报道索引大小通常会多对应一页,而不是内部页面+叶子页面+空白页面+删除页面,因为它还包括索引的元页面。

就像pgstattuple,结果是逐页累积的,不应期望代表整个索引的瞬时快照。

pgstatidex(文本)返回记录

这和pgstatindex(regclass),但目标索引指定为文本。由于到目前为止的向后兼容性,这个函数被保留了下来,并且在将来的一些版本中将被弃用。

PGSTATGINDEX(regclass)返回记录

PGSTATGINDEX返回显示有关GIN索引信息的记录。例如:

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

输出列包括:

类型 描述
版本 整数 杜松子酒版本号
待定页面 整数 待处理列表中的页数
待定元组 比基特 挂起列表中的元组数

pgstathashindex(regclass)返回记录

pgstathashindex返回显示哈希索引信息的记录。例如:

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

输出列包括:

类型 描述
版本 整数 哈希版本号
木桶纸 比基特 存储桶页数
页面溢出 比基特 溢出页数
位图页面 比基特 位图页数
未使用的页面 比基特 未使用的页面数
现场物品 比基特 活动元组数
死元组 比基特 死元组数
免费百分比 浮动 可用空间的百分比

pg_relpages(regclass)返回bigint

pg_relpages返回关系中的页数。

pg_relpages(text)返回bigint

这和pg_relpages(regclass),但目标关系指定为文本。由于到目前为止的向后兼容性,这个函数被保留了下来,并且在将来的一些版本中将被弃用。

pgstattuple_近似值(regclass)返回记录

pgstattuple_近似值是一种更快的替代方案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_近似值尝试避免全表扫描,并返回精确的死元组统计信息,以及活元组和可用空间的数量和大小的近似值。

它通过根据可见性映射跳过只有可见元组的页面来实现这一点(如果页面设置了相应的VM位,则假定它不包含死元组)。对于这样的页面,它从空闲空间映射中导出空闲空间值,并假设页面上的剩余空间被活动元组占用。

对于不能跳过的页面,它扫描每个元组,在适当的计数器中记录其存在和大小,并将页面上的可用空间相加。最后,它根据扫描的页面数和元组数估计活动元组的总数(与VACUUM估计pg的方法相同)_班重元组)。

表F.24. pgstattuple_近似值输出列

类型 描述
表_len 比基特 以字节为单位的物理关系长度(精确)
百分之十 浮动8 扫描表格的百分比
近似元组计数 比基特 活动元组数(估计)
近似元组 比基特 活动元组的总长度(字节)(估计)
大约百分之十 浮动8 活动元组的百分比
死元组计数 比基特 死元组数(精确)
死了 比基特 以字节为单位的死元组总长度(精确)
死亡百分比 浮动8 死亡元组的百分比
大约自由空间 比基特 总可用空间(字节)(估计)
大约自由百分比 浮动8 可用空间的百分比

在上述输出中,自由空间数字可能与pgstattuple输出精确,因为自由空间映射为我们提供了一个精确的数字,但不能保证精确到字节。

# F.31.2.作者

石井达夫、长谷聪和阿比吉特·梅农·森