Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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_statspg_statistic 的公开可读视图,它只公开当前用户可读表的信息。

表 51.51. pg_statistic

列类型

描述

starelid oid(引用了 pg_class.oid

描述的列所属的表或索引

staattnum int2(引用了 pg_attribute.attnum

描述的列的编号

stainherit bool

如果为真,则统计信息除了指定关系中的值之外还包括子表中的值

stanullfrac float4

列的条目中 NULL 的部分

stawidth int4

非 NULL 条目的平均存储宽度(以字节为单位)

stadistinct float4

列中非 NULL 数据值的唯一数量。大于零的值为唯一值实际数量。小于零的值为表中行数乘数的负数;例如,其中大约 80% 的值是非 NULL 且每个非 NULL 值平均出现两次的列可以表示为 stadistinct = -0.4。零值表示未知唯一值的数量。

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 更具体地定义这些列的类型。