PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

52.51. pg_statistic #

目录 pg_statistic 存储关于数据库内容的 统计数据。条目由 ANALYZE 创建,随后由查询规划器使用。注意,所有统计数据本质上都是近似的, 即使假定它们是最新的。

通常,每个被分析过的表列有一个 stainherit = false 的条目。 如果该表有继承子表或分区,则还会创建一个 stainherit = true 的第二个条目。该行表示该列在整个继承树上的统计信息, 即 SELECT column FROM table* 所看到的数据的统计信息, 而 stainherit = false 的行表示 SELECT column FROM ONLY table 的结果。

pg_statistic 还存储关于索引表达式值的 统计数据。它们的描述就好像它们是实际的数据列一样; 特别地,starelid 引用该索引。 不过,普通的非表达式索引列不会创建条目, 因为那会与底层表列的条目冗余。目前, 索引表达式的条目总是 stainherit = false。

由于不同种类的数据可能适合不同种类的统计信息, pg_statistic 的设计不对其存储的统计信息类型 做太多假设。只有极其通用的统计信息(例如空值性) 才会在 pg_statistic 中拥有专门的列。 其他一切都存储在“槽”中, 槽是一组相关联的列,其内容由槽中某一列的代码号标识。 更多信息见 src/include/catalog/pg_statistic.h。

pg_statistic 不应被公众读取, 因为即便是关于表内容的统计信息也可能被视为敏感信息。 (例如:薪金列的最小值和最大值可能相当引人关注。) pg_stats 是 pg_statistic 上一个公开可读的视图, 它只暴露当前用户可读的那些表的信息。

Table 52.51. \1 字段列说明

Column Type

Description

starelid oid (references pg_class.oid)

所描述的列所属的表或索引

staattnum int2 (references pg_attribute.attnum)

被描述列的编号

stainherit bool

如果为真,统计信息包括来自子表的值,而不只是指定关系中的值

stanullfrac float4

列条目中空值所占的比例

stawidth int4

非空条目的平均存储宽度(以字节为单位)

stadistinct float4

该列中不同的非空数据值的个数。 大于零的值是不同值的实际数目。 小于零的值是表中行数乘数的相反数;例如, 一列中约 80% 的值非空,且每个非空值平均大约出现两次, 则可以表示为 stadistinct = -0.4。 零值表示不同值的个数未知。

stakindN int2

一个代码号,指示存储在 pg_statistic 行的第 N 个“槽”中的统计信息的种类。

staopN oid (references pg_operator.oid)

用于推导存储在第 N 个 “槽”中的统计信息的操作符。例如, 直方图槽会展示定义数据排序顺序的 < 操作符。 如果该统计种类不需要操作符则为零。

stacollN oid (references pg_collation.oid)

用于推导存储在第 N 个 “槽”中的统计信息的排序规则。例如, 可排序列的直方图槽会展示定义数据排序顺序的排序规则。 对于不可排序数据则为零。

stanumbersN float4[]

第 N 个“槽”的相应种类的 数值统计信息;如果该槽种类不涉及数值则为空

stavaluesN anyarray

第 N 个“槽”的相应种类的 列数据值;如果该槽种类不存储任何数据值则为空。 每个数组的元素值实际上都是特定列的数据类型, 或诸如数组元素类型之类的相关类型, 因此没有办法把这些列的类型定义得比 anyarray 更具体。