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