pg_statistic
pg_statistic
pg_statistic系统目录表存储有关数据库内容的统计数据。其中的项由ANALYZE 创建,查询规划器会使用这些数据来进行查询规划。每个已经被分析的表列都有一项。注意所有的统计数据天然就是近似的,即使它刚刚被更新。
pg_statistic也存储关于索引表达式值的统计数据,就好像它们是真正的数据列,但在这种情况中starelid引用索引。不过,对一个普通非表达式索引列不会创建项,因为它将是底层表列的项的冗余。
因为不同类型的统计信息适用于不同类型的数据,pg_statistic被设计成不对自己存储的统计数据类型做太多假设。 只有极为常用的统计信息(比如空值)才在pg_statistic里给予专用的字段。其它所有东西都存储在“槽位”中,而槽位是一组相关的列, 它们的内容用槽位中的一个列里的代码表示。
pg_statistic不应该是公共可读的,因为即使是一个表内容的统计性信息也可能被认为是敏感的(例子:一个薪水列的最大和最小值)。pg_stats是pg_statistic上的一个公共可读的视图,它只会显示出当前用户可读的表的信息。
名称 | 类型 | 引用 | 描述 |
---|---|---|---|
starelid | oid | pg_class.oid | 被描述列所属的表或索引。 |
staattnum | int2 | pg_attribute.attnum | 被描述列的编号。 |
stanullfrac | float4 | 列项为空的比例。 | |
stawidth | int4 | 非空项的平均存储宽度,以字节计。 | |
stadistinct | float4 | 列中非空唯一值的数目。一个大于零的值是唯一值的真正数目。一个小于零的值是表中行数的乘数的负值(例如,对于一个 每个值平均出现两次的列,可以表示为stadistinct = -0.5)。一个0值表示唯一值的数目未知。 | |
stakindN | int2 | 一个代码,它表示存储在该pg_statistic行中第N个“槽位”的统计类型。 | |
staopN | oid | pg_operator.oid | 一个用于生成这些存储在第N个“槽位”的统计信息的操作符。 比如,一个柱状图槽位会用<操作符,该操作符定义了该数据的排序顺序。 |
stanumbersN | float4[] | 第N个“槽位”的类型的数值类型统计,如果该槽位不涉及数值类型则为NULL。 | |
stavaluesN | anyarray | 第N个“槽位”的类型的列值,如果该槽位类型不存储任何数据值则为 NULL。 每个数组的元素值实际上都是指定列的数据类型,因此,除了把这些列的类型定义成anyarray之外别无他法。 |