受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

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

pg_statistic不应公开可读,因为即使是表内容的统计信息也可能被认为是敏感的(例如,一个工资列的最大值和最小值就可能非常引人关注)。pg_stats是建立在pg_statistic之上的公开可读视图,它只会显示当前用户可读取的表的信息。

Table 51.51. pg_statistic

列类型

描述

starelid oid (引用 pg_class.oid

被描述列所属的表或索引

staattnum int2 (引用 pg_attribute.attnum

被描述列的编号

stainherit bool

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

stanullfrac float4

列的项为空的比例

stawidth int4

非空项的平均存储宽度,以字节计

stadistinct float4

列中非空唯一值的数目。一个大于零的值是唯一值的真正数目。 一个小于零的值是表中行数的乘数的负值;例如,对于一个 80% 的值为非空且每个非空值平均出现两次的列,可以表示为stadistinct = -0.4。一个0值表示唯一值的数目未知。

stakindN int2

一个代码,它表示存储在该pg_statistic行中第N槽位的统计类型。

staopN oid (引用 pg_operator.oid

一个用于生成这些存储在第N槽位的统计信息的操作符。 例如,直方图槽位会使用<操作符,该操作符定义了这些数据的排序顺序。 如果统计类型不需要操作符则为零。

stacollN oid (引用 pg_collation.oid

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

stanumbersN float4[]

N槽位的类型的数值类型统计, 如果该槽位不涉及数值类型则为NULL

stavaluesN anyarray

N槽位的类型的列值,如果该槽位类型不存储任何数据值则为 NULL。 每个数组的元素值实际上都是指定列的数据类型或者是一个相关类型(如数组元素类型), 因此,除了把这些列的类型定义成anyarray之外别无他法。


提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。