47.43. 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 47-43. pg_statistic
字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
starelid |
oid |
pg_class .oid |
所描述的字段所属的表或者索引 |
staattnum |
int2 |
pg_attribute .attnum |
所描述的字段的个数 |
stainherit |
bool |
如果为真,那么统计数据包含继承子字段,不只是指定关系中的值。 | |
stanullfrac |
float4 |
该字段中为 NULL 的记录的比率 | |
stawidth |
int4 |
非 NULL 记录的平均存储宽度,以字节计 | |
stadistinct |
float4 |
字段里唯一的非 NULL 数据值的数目。一个大于零的数值是独立数值的实际数目。 一个小于零的数值是表中行数的乘数的负数(比如,一个字段的数值平均出现概率为两次, 那么可以表示为stadistinct = -0.5)。零值表示独立数值的数目未知。 |
|
stakind``_N_ |
int2 |
一个编码,表示这种类型的统计存储在pg_statistic 行的第_N_ 个"槽位"。 |
|
staop``_N_ |
oid |
pg_operator .oid |
一个用于生成这些存储在第_N_ 个"槽位"的统计信息的操作符。 比如,一个柱面图槽位会显示< 操作符,该操作符定义了该数据的排序顺序。 |
stanumbers``_N_ |
float4[] |
第_N_ 个"槽位"的相关类型的数值统计, 如果该槽位和数值没有关系,那么就是 NULL 。 |
|
stavalues``_N_ |
anyarray |
第_N_ 个"槽位"相关类型的字段数据值, 如果该槽位类型不存储任何数据值那么就是 NULL 。 每个数组的元素值实际上都是指定字段的数据类型,或相关类型如一个数组的元素类型, 因此,除了把这些字段的类型定义成anyarray 之外,没有更好的办法。 |