Postgresql 中文操作指南

F.33. pgstattuple — obtain tuple-level statistics #

pgstattuple 模块提供各种函数来获取元组级统计信息。

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

F.33.1. Functions #

  • pgstattuple(regclass) returns record

    • pgstattuple 返回关系的物理长度,“死亡”元组的百分比以及其他信息。这有助于用户确定是否需要 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 F.24 中进行了描述。

  • pgstattuple 仅获取关系上的读取锁定。因此,这些结果不会反映即时快照;并发更新会影响它们。

  • 如果 HeapTupleSatisfiesDirty 返回 false,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
  • The output columns are:

  • 所报告的 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
  • The output columns are:

    • pgstathashindex(regclass) returns 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
  • The output columns are:

    • 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
  • 输出列在 Table F.25 中进行了描述。

  • 虽然 pgstattuple 总会执行全表扫描并返回有效和无效元组(及其大小)和可用空间的确切计数,但 pgstattuple_approx 会尝试避免全表扫描并返回确切的无效元组统计信息以及有效元组和可用空间的数量和大小的近似值。

  • 它通过跳过根据可见性映射只有可见元组的页来实现(如果页具有相应的 VM 位集,则假定不包含任何无效元组)。对于此类页,它从可用空间映射中得出可用空间值,并假定页上的剩余空间被有效元组占用。

  • 对于无法跳过的页,它扫描每个元组,在适当的计数器中记录其位置和大小,并加总页上的可用空间。最后,它根据扫描的页和元组的数量估算有效元组的总数(与 VACUUM 估算 pg_class.reltuples 的方式相同)。

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

Table F.24. pgstattuple Output Columns

Column

Type

Description

table_len

bigint

以字节为单位的物理关系长度

tuple_count

bigint

Number of live tuples

tuple_len

bigint

以字节为单位的活动元组的总长度

tuple_percent

float8

Percentage of live tuples

dead_tuple_count

bigint

Number of dead tuples

dead_tuple_len

bigint

以字节为单位的死亡元组的总长度

dead_tuple_percent

float8

Percentage of dead tuples

free_space

bigint

字节中的可用空间总数

free_percent

float8

Percentage of free space

Note

table_len 将始终大于 tuple_lendead_tuple_lenfree_space 的总和。差异是由固定页面开销、指向元组的每页指针表以及确保元组正确对齐的填充来解释的。

Table F.25. pgstattuple_approx Output Columns

Column

Type

Description

table_len

bigint

字节中的物理关系长度(精确)

scanned_percent

float8

Percentage of table scanned

approx_tuple_count

bigint

正在使用的元组总数(估计值)

approx_tuple_len

bigint

字节中的正在使用的元组总数(估计值)

approx_tuple_percent

float8

Percentage of live tuples

dead_tuple_count

bigint

正在使用的元组总数(精确)

dead_tuple_len

bigint

字节中的正在使用的元组总数(精确)

dead_tuple_percent

float8

Percentage of dead tuples

approx_free_space

bigint

估计值(字节)的可用空间

approx_free_percent

float8

Percentage of free space

F.33.2. Authors #

Tatsuo Ishii、Satoshi Nagayasu 和 Abhijit Menon-Sen