52.50. 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不应为公众所理解,因为即使有关表内容的统计信息也可能被视为敏感信息。 (示例:salary 列的最小值和最大值可能很有趣.)pg_statspg_statistic上的公共可读视图,该视图仅公开有关当前用户可读的那些表的信息。

表 52.50. pg_statistic

NameTypeReferencesDescription
starelidoidpg_class.oid所描述的列所属的表或索引
staattnumint2pg_attribute.attnum所描述的栏数
stainheritbool 如果为 true,则统计信息包括继承子列,而不仅仅是指定关系中的值
stanullfracfloat4 列条目中为零的分数
stawidthint4 非空条目的平均存储宽度(以字节为单位)
stadistinctfloat4 列中不同的非空数据值的数量。大于零的值是不同值的实际数量。小于零的值是表中行数乘数的负数;例如,一列中的大约 80%的值是非空值,并且每个非空值平均出现大约两次,可以用stadistinct = -0.4 表示。零值表示不同值的数量未知。
stakindNint2 一个代码号,指示存储在pg_statistic行的* N *个“插槽”中的统计信息的类型。
staopNoidpg_operator.oid一个运算符,用于导出存储在第_1 个插槽中的统计信息。例如,直方图槽将显示<运算符,该运算符定义了数据的排序 Sequences。
stanumbersNfloat4[] * N *个“ slot”的适当种类的数值统计;如果该 slot 类型不包含数值,则为 null
stavaluesNanyarray 第* N *个“插槽”的适当类型的列数据值;如果插槽类型不存储任何数据值,则为 null。每个数组的元素值实际上都是特定列的数据类型,或者是诸如数组的元素类型之类的相关类型,因此没有比anyarray更具体地定义这些列的类型的方法。