43.27. pg_statistic

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

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

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

Table 43-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" 之外, 沒有更好的辦法。