48.44. 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_statspg_statistic上的一个公共可读的视图,它只会显示出当前用户可读的表的信息。

Table 48-44. pg_statistic的列

名称类型引用描述
starelidoidpg_class.oid被描述列所属的表或索引
staattnumint2pg_attribute.attnum被描述列的编号
stainheritbool 如果为真,统计包含了继承后代的列而不仅仅是指定关系的列
stanullfracfloat4 列的项为空的比例
stawidthint4 非空项的平均存储宽度,以字节计
stadistinctfloat4 列中非空唯一值的数目。一个大于零的值是唯一值的真正数目。一个小于零的值是表中行数的乘数的负值;例如,值平均出现两次的一个列可以表示为stadistinct = -0.5。一个0值表示唯一值的数目未知。
stakindNint2  一个代码,它表示存储在该pg_statistic行中第N"槽位"的统计类型。
staopNoidpg_operator.oid 一个用于生成这些存储在第N"槽位"的统计信息的操作符。 比如,一个柱面图槽位会用<操作符,该操作符定义了该数据的排序顺序。
stanumbersNfloat4[] N"槽位"的类型的数值类型统计, 如果该槽位不涉及数值类型则为NULL
stavaluesNanyarray N"槽位"的类型的列值,如果该槽位类型不存储任何数据值则为 NULL。 每个数组的元素值实际上都是指定列的数据类型或者是一个相关类型(如数组元素类型), 因此,除了把这些列的类型定义成anyarray之外别无他法。