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


提交更正

如果您在文件中發現任何不正確之處、與您在使用特定功能時的實際經驗不符之處,或者需要進一步澄清之處,請使用 此表單 報告文件問題。