pg_statistic

pg_statistic

pg_statistic系统目录表存储有关数据库内容的统计数据。 其中的项由ANALYZE创建,查询规划器会使用这些数据来进行查询规划。 每个已经被分析的表列都有一项。注意所有的统计数据天然就是近似的,即使它刚刚被更新。

pg_statistic还存储有关索引表达式值的统计数据。 这些被描述为它们是实际的数据列; 特别是,starelid引用了索引。 但是,没有为普通的非表达式索引列创建条目,因为它对于基础表列的条目是多余的。 目前,索引表达式的条目始终具有stainherit = false

stainherit = false时,每个表格列通常有一个条目已被分析。 如果表具有继承子项,则Greenplum数据库会创建第二个条目,其中stainherit = true。 此行表示列在继承树上的统计信息,例如,您将使用SELECT column FROM table*看到的数据的统计信息, 而stainherit = false行表示SELECT column FROM ONLY table表的结果。

由于不同类型的统计数据可能适用于不同类型的数据,因此pg_statistic不会非常假设它存储的是哪种统计数据。 在pg_statistic中只给出了非常普通的统计信息(例如nullness)。 其他所有内容都存储在插槽中,插槽是相关列的组,其内容由插槽列之一中的代码编号标识。

pg_statistic不应该被公众读取,因为即使关于表的内容的统计信息也可能被认为是敏感的(例如:工资列的最小值和最大值)。 pg_statspg_statistic上的公共可读视图,它只公开有关当前用户可读的表的信息。

Table 1. pg_catalog.pg_statistic
类型 参考 描述
starelid oid pg_class.oid 被描述列所属的表或索引。
staattnum int2 pg_attribute.attnum 被描述列的编号。
stainherit bool   如果为true,则统计信息包括继承子列,而不仅仅是指定关系中的值。
stanullfrac float4   列项为空的比例。
stawidth int4   非空项的平均存储宽度,以字节计。
stadistinct float4   列中不同的非空数据值的数量。 大于零的值是不同值的实际数量。 小于零的值是表中行数的乘数的负值(例如,其中值平均显示两次的列可以由stadistinct = -0.5表示)。 零值表示不同值的数量未知。
stakindN int2   一个代码,它表示存储在该pg_statistic行中第N个“槽位”的统计类型。
staopN oid pg_operator.oid 一个用于生成这些存储在第N个“槽位”的统计信息的操作符。 比如,一个柱状图槽位会用<操作符,该操作符定义了该数据的排序顺序。
stanumbersN float4[]   N个“槽位”的类型的数值类型统计,如果该槽位不涉及数值类型则为NULL。
stavaluesN anyarray   N个“槽位”的类型的列值,如果该槽位类型不存储任何数据值则为NULL。 每个数组的元素值实际上都是指定列的数据类型,因此,除了把这些列的类型定义成anyarray之外别无他法。