pg_statistic カタログはデータベースの内容に関す統計データを保存します。エントリは ANALYZE で作成され、後に問い合わせプランナで使用されます。ANALYZE(分析)されたそれぞれのテーブルの列に対し一つのエントリが存在します。最新のものと思っても全ての統計データは本質的に大雑把なものであることに注意してください。
異なる種類のデータに対しては違った種類の統計が相応しいことから pg_statistic はどのような情報を保存するか深く推定しないように設計されています。(例えば NULL であるような)極端に一般的な統計のみ pg_statistic の特定の列に入ります。その他全てはスロット列のうちのひとつのコード番号でその内容が識別される相関している列のグループである "スロット" に保存されます。より詳しい情報は src/include/catalog/pg_statistic.h から入手して下さい。
pg_statistic はテーブル内容に関する情報と言えども高度の慎重さを要することから一般のユーザが読めるようになっていてはなりません。(給与列の最高額と最低額などは誰もが興味をそそる良い例ですよね。)pg_stats は一般のユーザが読める pg_statistic 上のビューで既存のユーザが読んでも差し支えないテーブルの情報のみを開示しています。
表 43-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 | anyarray | N 番目"スロット"に対する適切な種類の列データの値、もしくはスロットの種類にデータ値が何も保存されていない場合は NULL。それぞれの配列要素の値は実際には特定された列のデータ型になります。ですから anyarray とする以外に列型を定義することはできません。 |