# F.31.pgstattuple
这个pgstattuple
模块提供了各种获取元组级统计信息的功能。
因为这些函数返回详细的页面级信息,所以默认情况下访问受到限制。默认情况下,只有角色pg_统计_扫描_表格
有处决
特权超级用户当然会绕过这个限制。安装扩展后,用户可能会发出授予
用于更改函数权限以允许其他人执行的命令。但是,最好将这些用户添加到pg_统计_扫描_表格
角色。
# F.31.1.功能
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
返回显示有关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
返回显示有关GIN索引信息的记录。例如:
test=> SELECT * FROM pgstatginindex('test_gin_index');
-[ RECORD 1 ]--+--
version | 1
pending_pages | 0
pending_tuples | 0
输出列包括:
柱 | 类型 | 描述 |
---|---|---|
版本 | 整数 | 杜松子酒版本号 |
待定页面 | 整数 | 待处理列表中的页数 |
待定元组 | 比基特 | 挂起列表中的元组数 |
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
返回关系中的页数。
pg_relpages(text)返回bigint
这和pg_relpages(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.作者
石井达夫、长谷聪和阿比吉特·梅农·森