41.27. pg_statistic

pg_statistic資料表儲存有關該資料庫內容的統計資料。 記錄是 ANALYZE 建立的,並且隨後被查詢規劃器使用。 請注意所有統計訊息天生都是近似的數值,即使我們假設它是最新的也如此。

pg_statistic 還儲存有關索引資料表達式數值的統計資料。 這些是把他們當作實際的資料字串來描述的;特別是,starelid 引用索引。 不過,普通的非資料表達式字串沒有記錄,因為會和下層的資料表字串記錄冗余。

因為不同類型的統計訊息適用於不同類型的資料, pg_statistic 被設計成不太在意自己儲存的是什麼類型的統計。 只有極為常用的統計訊息(比如NULL的含量)才在 pg_statistic裡給予專用的字串。 其它所有東西都儲存在"槽位"中,而槽位是一組相關的字串, 它們的內容用槽位中的一個字串的代碼號碼資料表示。 更詳細的訊息請參閱 src/include/catalog/pg_statistic.h

pg_statistic 不應該是公眾可讀的, 因為即使是資料表內容的統計訊息也應該認為是敏感的。 (例子:薪水字串的最大最小值肯定是相當讓人感興趣的。) pg_stats 是一個在 pg_statistic 上的全局可讀的視圖,它只顯示那些資料表對於目前用戶可讀的訊息。 pg_stats 也設計成具有比其所依靠的下層 pg_statistic 資料表更具可讀性的訊息 --- 代價是增加新的槽位類型的時候,它的模式必須擴展。

Table 41-27. pg_statistic 字串

名字類型參考描述
starelidoidpg_class.oid所描述的字串所屬的資料表或者索引
staattnumint2pg_attribute.attnum所描述的字串的個數
stanullfracfloat4 該字串中為 NULL 的記錄的比率
stawidthint4 非 NULL 記錄的平均儲存寬度,以字元計
stadistinctfloat4  字串裡唯一的非 NULL 資料值的數目。 一個大於零的數值是獨立數值的實際數目。 一個小於零的數值是資料表中行數的分數的負數(比如,一個字串的數值平均出現概率為兩次,那麼可以資料表示為 stadistinct = -0.5)。 零值資料表示獨立數值的數目未知。
stakindNint2  一個編碼,資料表示這種類型的統計儲存在 pg_statistic 行的 第N"槽位"
staopNoidpg_operator.oid 一個用於生成這些儲存在第N"槽位"的統計訊息的操作符。 比如,一個柱面圖槽位會顯示<操作符,該操作符定義了 該資料的排序順序。
stanumbersNfloat4[] N"槽位"的相關類型的數值類型統計, 如果該槽位和數值類型沒有關係,那麼就是NULL。
stavaluesNanyarray N"槽位"相關類型的字串資料值,如果該槽位類型不儲存 任何資料值那麼就是 NULL。 每個數組的元素值實際上都是指定字串的資料類型, 因此,除了把這些字串的類型定義成 "anyarray" 之外, 沒有更好的辦法。