2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

52.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 中有专门的列。其他所有内容都存储在“槽”(slots)中,这些槽是相关列的组,其内容通过其中一个槽列中的代码编号进行标识。有关更多信息,请参阅 src/include/catalog/pg_statistic.h

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

表 52.51. pg_statistic

列 类型

描述

starelid oid (引用 pg_class.oid)

所描述列所属的表或索引

staattnum int2 (引用 pg_attribute.attnum)

所描述列的编号

stainherit bool

如果为 true,则统计信息包含子表的值,而不仅仅是指定关系中的值。

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 更具体。


提交更正

如果您在文档中发现任何不正确之处、与您在使用特定功能时的实际经验不符之处,或者需要进一步澄清之处,请使用 此表单 报告文档问题。