pg_statistic
关于数据库系统(特别是PostgreSQL数据库)中的统计信息目录pg_statistic
的说明。
-
统计数据存储:
pg_statistic
目录存储有关数据库内容的统计数据。这些数据是由ANALYZE
命令创建的,并随后被查询优化器使用。需要注意的是,即使这些统计数据是最新的,它们本质上也是近似的。 -
统计数据条目:通常情况下,对于每个已分析的表列,会有一个条目,其中
stainherit
属性设置为false
。如果表有继承的子表或分区,则还会创建一个stainherit
属性设置为true
的条目。这个true
的条目代表了继承树中列的统计数据,即你使用SELECT column FROM table*
查询时看到的数据。而stainherit = false
的行则代表了SELECT column FROM ONLY table
查询的结果。 -
索引表达式的统计数据:
pg_statistic
还存储有关索引表达式值的统计数据。这些表达式被描述得就像它们是实际的数据列一样;特别是,starelid
引用了索引。然而,对于普通的非表达式索引列,不会创建条目,因为这会与底层表列的条目重复。目前,索引表达式的条目总是将stainherit
设置为false
。 -
统计数据的多样性:由于不同类型的数据可能需要不同类型的统计信息,
pg_statistic
被设计为不对它存储的统计信息类型做太多假设。只有非常通用的统计信息(如空值情况)在pg_statistic
中有专门的列。其他所有内容都存储在“slots”中,这些是相关联的列组,其内容由其中一个slot列中的代码编号标识。 -
安全性:
pg_statistic
不应该对公众可读,因为即使是关于表内容的统计信息也可能被认为是敏感的。例如,一个工资列的最小值和最大值可能非常有趣。pg_stats
是pg_statistic
的一个公开可读视图,它只暴露当前用户可读的那些表的信息。
这段话主要解释了pg_statistic
目录的功能、用途以及它如何存储和管理数据库的统计信息。
这段内容描述的是 PostgreSQL 数据库中的 pg_statistic
表的列及其数据类型和描述。下面是对这些列的解释:
-
starelid (oid): 这列存储的是表或索引的 OID(对象标识符),它指向
pg_class
表中的 OID。这表示所描述的列属于哪个表或索引。 -
staattnum (int2): 这列存储的是被描述列的列号,它指向
pg_attribute
表中的attnum
。这表示在所属表中,该列的顺序编号。 -
stainherit (bool): 这是一个布尔值,如果为真,则表示统计信息包括子表中的值,而不仅仅是指定关系中的值。
-
stanullfrac (float4): 这列存储的是该列中空值(null)条目的比例。
-
stawidth (int4): 这列存储的是该列非空(nonnull)条目的平均存储宽度,单位是字节。
-
stadistinct (float4): 这列存储的是该列中不同非空数据值的数量。如果值大于零,则表示实际的不同值数量。如果值小于零,则表示与表中行数的乘数的负数;例如,如果一个列大约80%的值是非空的,并且每个非空值平均出现两次,那么可以用
stadistinct = -0.4
来表示。值为零意味着不同值的数量未知。 -
stakindN (int2): 这列是一个代码数字,表示存储在
pg_statistic
行的第 N 个“槽”中的统计信息类型。 -
staopN (oid): 这列存储的是用于派生第 N 个“槽”中存储的统计信息的运算符,它指向
pg_operator
表中的 OID。例如,直方图槽会显示定义数据排序顺序的<
运算符。如果统计信息类型不需要运算符,则为零。 -
stacollN (oid): 这列存储的是用于派生第 N 个“槽”中存储的统计信息的校对规则,它指向
pg_collation
表中的 OID。例如,对于可校对的列的直方图槽,会显示定义数据排序顺序的校对规则。对于不可校对的数据,值为零。 -
stanumbersN (float4[]): 这列存储的是第 N 个“槽”的适当类型的数值统计信息,或者如果槽类型不涉及数值,则为 null。
-
stavaluesN (anyarray): 这列存储的是第 N 个“槽”的适当类型的列数据值,或者如果槽类型不存储任何数据值,则为 null。每个数组的元素值实际上是特定列的数据类型,或者是相关类型,例如数组的元素类型,因此无法比
anyarray
更具体地定义这些列的类型。