PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 48. 系统表 | 下一页

# 48.44. `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`上的全局可读的视图，它只显示那些表对于当前用户可读的信息。

表 48-44. `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`之外，没有更好的办法。

上一页 | 起始页 | 下一页
`pg_shseclabel` | 上一级 | `pg_tablespace`