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_stats是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之外别无他法。 |