pg_statistic表存储有关该数据库内容的统计数据。 记录是 ANALYZE 创建的,并且随后被查询规划器使用。 请注意所有统计信息天生都是近似的数值,即使我们假设它是最新的也如此。
pg_statistic 还存储有关索引表达式数值的统计数据。 这些是把他们当作实际的数据字段来描述的;特别是,starelid 引用索引。 不过,普通的非表达式字段没有记录,因为会和下层的表字段记录冗余。
因为不同类型的统计信息适用于不同类型的数据, pg_statistic 被设计成不太在意自己存储的是什么类型的统计。 只有极为常用的统计信息(比如NULL的含量)才在 pg_statistic里给予专用的字段。 其它所有东西都存储在"槽位"中,而槽位是一组相关的字段, 它们的内容用槽位中的一个字段的代码号码表示。 更详细的信息请参阅 src/include/catalog/pg_statistic.h。
pg_statistic 不应该是公众可读的, 因为即使是表内容的统计信息也应该认为是敏感的。 (例子:薪水字段的最大最小值肯定是相当让人感兴趣的。) pg_stats 是一个在 pg_statistic 上的全局可读的视图,它只显示那些表对于当前用户可读的信息。 pg_stats 也设计成具有比其所依靠的下层 pg_statistic 表更具可读性的信息 --- 代价是增加新的槽位类型的时候,它的模式必须扩展。
Table 42-30. pg_statistic 字段
名字 | 类型 | 参考 | 描述 |
---|---|---|---|
starelid | oid | pg_class.oid | 所描述的字段所属的表或者索引 |
staattnum | int2 | pg_attribute.attnum | 所描述的字段的个数 |
stanullfrac | float4 | 该字段中为 NULL 的记录的比率 | |
stawidth | int4 | 非 NULL 记录的平均存储宽度,以字节计 | |
stadistinct | float4 | 字段里唯一的非 NULL 数据值的数目。 一个大于零的数值是独立数值的实际数目。 一个小于零的数值是表中行数的分数的负数(比如,一个字段的数值平均出现概率为两次,那么可以表示为 stadistinct = -0.5)。 零值表示独立数值的数目未知。 | |
stakindN | int2 | 一个编码,表示这种类型的统计存储在 pg_statistic 行的 第N个"槽位"。 | |
staopN | oid | pg_operator.oid | 一个用于生成这些存储在第N个"槽位"的统计信息的操作符。 比如,一个柱面图槽位会显示<操作符,该操作符定义了 该数据的排序顺序。 |
stanumbersN | float4[] | 第N个"槽位"的相关类型的数值类型统计, 如果该槽位和数值类型没有关系,那么就是NULL。 | |
stavaluesN | anyarray | 第N个"槽位"相关类型的字段数据值,如果该槽位类型不存储 任何数据值那么就是 NULL。 每个数组的元素值实际上都是指定字段的数据类型, 因此,除了把这些字段的类型定义成 "anyarray" 之外, 没有更好的办法。 |