pg_statistic はデータベースの内容に関する統計データを保存します。見出し語は ANALYZE で作成され引き続いて問い合わせプランナで使用されます。ANALYZE(分析)されたそれぞれのテーブルの列に対しひとつの見出し語が存在します。一番新しいものと予想したとしてもすべての統計データは本質的に大雑把なものです。
異なる種類のデータに対しては違った種類の統計が相応しいことから pg_statistic はどのような情報を保存するか深く想定しないように設計されています。(例えば NULL であるような)極端に一般的な統計は pg_statistic の特定の列に入ります。その他すべてはスロット列のうちのひとつのコード番号でその内容が識別される相関している列のグループである "スロット" に保存されます。より詳しい情報は src/include/catalog/pg_statistic.h から入手して下さい。
pg_statistic はテーブル内容に関する情報と言えども高度の慎重さを要することから一般のユーザーが読めるようになっていてはなりません。 (給与列の最高額と最低額の値などは良い例です。) pg_stats は一般のユーザーが読める pg_statistic 上のビューで既存のユーザーが読んでも差し支えないテーブルの情報のみを開示しています。 pg_stats は同時に基底になっている pg_statistic テーブルよりもそのスキーマは新規スロット型が追加された時はいつでも拡張されなければならないというコストを支払って、より読みやすい形式で情報を提示するように設計されています。
Table 3-27. pg_statistic の列
名前 | 型 | 参照先 | 説明 |
---|---|---|---|
starelid | oid | pg_class.oid | 記述された列が所属するテーブル |
staattnum | int2 | pg_attribute.attnum | 記述された列の数 |
stanullfrac | float4 | NULL 値の列の見出し語の割合 | |
stawidth | int4 | 非 NULL 値見出し語のバイト表現による平均保存幅 | |
stadistinct | float4 | 列内の DISTINCT で 非 NULL であるデータ値の個数。ゼロより大きい値は弁別的値の実際の数です。ゼロより小さい値はテーブル内の行の数の割合が負ということです(例えば、AVERAGE で 2 回ほど出現する値を持つ列は stadistinct = -0.5 であると表現されます)。値がゼロは弁別的値の数が特定できない時です。 | |
stakindN | int2 | pg_statistic 行の N 番目"スロット"に保存されている統計情報の種類を示すコード番号。 | |
staopN | oid | pg_operator.oid | N 番目"スロット"に保存される統計情報派生に使われる演算子。例えば、度数分布スロットはデータの並び換えの順序を指定する < 演算子を与えます。 |
stanumbersN | float4[] | N 番目"スロット"に対する適切な種類の数値統計情報、あるいはスロットの種類に数値が含まれない時は NULL。 | |
stavaluesN | text[] | N 番目"スロット"に対する適切な種類の列データの値、あるいはスロットの種類になんのデータ値が保存されていない時は NULL。 データ型非依存に対しすべての列データ値は外部テキスト形式に変換され TEXT 型データとして保存されます。 |