45.36. 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设计成不太在意 自己存储的是什么类型的统计。只有极为常用的统计信息(比如NULL)才 在pg_statistic里给予专用的字段。其它所有东西都存储在"槽位"中, 而槽位是一组相关的字段,它们的内容用槽位中的一个字段的编码号表示。 更详细的信息请参阅src/include/catalog/pg_statistic.h

pg_statistic不应该是公开可读的,因为即使是表内容的统计信息也应该认为 是敏感的。例如:薪水字段的最大最小值肯定是相当让人感兴趣的。 pg_stats是一 个在pg_statistic上的全局可读的视图, 它只显示那些表对于当前用户可读的信息。

Table 45-36. pg_statistic Columns

名称类型引用描述
starelidoidpg_class.oid所描述的字段所属的表或索引
staattnumint2pg_attribute.attnum所描述的字段数
stainheritbool 如果为真,统计包括继承子列,而不仅是 指定关系值
stanullfracfloat4 该字段中为NULL记录的比率
stawidthint4 非NULL记录的平均存储宽度,以字节计
stadistinctfloat4  字段里不同的非NULL数据值数。一个大于零的数值是不同值的实际数。 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次, 那么可以表示为stadistinct = -0.5)。零值表示不同数值的数量是未知的。
stakindNint2  一个编码,表示这种类型的统计存储在pg_statistic行的第N"槽位"
staopNoidpg_operator.oid 一个用于生成这些存储在第N"槽位"的统计信息的操作符。 比如,一个柱面图槽位会显示<操作符,该操作符定义了该数据的排序顺序。
stanumbersNfloat4[] N"槽位"的相关类型的数值类型统计,如果该槽位和数值类型没有关系,那么就是NULL
stavaluesNanyarray N"槽位"相关类型的字段数据值,如果该槽位类型不存储任何数据 值那么就是 NULL 。每个数组的元素值实际上都是指定字段的数据类型, 因此,除了把这些字段的类型定义成anyarray。之外,没有更好的办法。