ltstattuple
模块提供了各种函数来获取元组级别的统计信息。
由于这些函数返回详细的页面级别信息,因此默认情况下访问受到限制。
默认情况下,只有角色 pg_stat_scan_tables
具有 EXECUTE
权限。
当然,超级用户可以绕过这个限制。
安装扩展后,用户可以发出 GRANT
命令来更改函数的权限,以允许其他用户执行它们。
然而,将这些用户添加到 pg_stat_scan_tables
角色可能更可取。
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 E.51 中描述。
Table E.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
| 空闲空间的百分比 |
table_len
始终大于 tuple_len
、dead_tuple_len
和
free_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_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
输出列的描述在 Table E.52 中。
pgstattuple
总是执行全表扫描并返回活动和死亡元组(及其大小)以及可用空间的精确计数,而 pgstattuple_approx
尝试避免全表扫描并返回精确的死亡元组统计信息以及近似的存活元组数和大小和可用空间。
它通过跳过仅包含可见元组的页面(根据可见性映射)来实现此目的(如果页面设置了相应的 VM 位,则假定不包含死亡元组)。对于这些页面,它从空闲空间映射中获取空闲空间值,并假设页面上的其余空间被存活元组占据。
对于无法跳过的页面,它会扫描每个元组,记录其存在和大小于相应的计数器中,并累加页面上的可用空间。最后,它基于扫描的页面和元组数量估计存活元组的总数(与 VACUUM 估计 pg_class.reltuples 的方式相同)。
Table E.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
的输出结果,因为空闲空间映射提供了精确的数字,但不能保证以字节为单位的精度完全准确。