pg_statistic
pg_statistic
カタログはデータベースの内容に関する統計データを保存します。
項目はANALYZEで作成され、後に問い合わせプランナで使用されます。
最新のものと思ってもすべての統計データは本質的に大雑把なものであることに注意してください。
通常は、解析されるテーブル列毎に、stainherit
= false
を持つ1つの項目が存在します。
テーブルが継承された子を持つ場合、stainherit
= true
を持つ2つ目の項目が作成されます。
この行は継承ツリー全体に渡る列の統計情報、つまり、SELECT
で確認できるデータに対する統計情報を表します。
一方でcolumn
FROM table
*stainherit
= false
の行はSELECT
の結果を表します。
column
FROM ONLY table
pg_statistic
はインデックス式の値についての統計データも格納します。
これらはあたかも値が実際のデータ列であるかのように表現されます。
特にstarelid
はインデックスを参照します。
これは元のテーブル列の項目に対して冗長となるので、普通の式を持たないインデックス列では項目は作成されません。
現在インデックス式用の項目は常にstainherit
= false
を持ちます。
異なる種類のデータに対しては違った種類の統計が相応しいことからpg_statistic
はどのような情報を保存するか深く推定しないように設計されています。
(例えばNULLであるような)極端に一般的な統計のみpg_statistic
の特定の列に入ります。
その他すべてはスロット列の内の1つのコード番号でその内容が識別される相関している列のグループである「スロット」に保存されます。
src/include/catalog/pg_statistic.h
を参照してください。
pg_statistic
はテーブル内容に関する統計情報と言えども秘密の情報とみなされますので、一般のユーザが読み取り可能であってはいけません。
(給与列の最高額と最低額などは誰もが興味をそそる良い例ですよね。)
pg_stats
は一般のユーザが読み取り可能なpg_statistic
に対するビューで、既存のユーザが読んでも差し支えないテーブルの情報のみを開示しています。
表49.45 pg_statistic
の列
名前 | 型 | 参照先 | 説明 |
---|---|---|---|
starelid | oid |
| 記述された列が属するテーブルもしくはインデックス |
staattnum | int2 |
| 記述された列数 |
stainherit | bool | 真の場合、統計情報には指定されたテーブルの値だけではなく、継承関係の子の列が含まれます。 | |
stanullfrac | float4 | NULL値である列項目の割合 | |
stawidth | int4 | 非NULL項目の平均保存幅(バイト単位) | |
stadistinct | float4 | 列内で非NULL個別値を持つデータ数。
ゼロより大きい値は実際の個別値の数です。
ゼロより小さい値はテーブル内の行数に対する乗数を負にしたものです。
例えば、約80%の値が非NULLで、それぞれの非NULL値が平均して2回ほど出現する列はstadistinct = -0.4であると表現されます。
ゼロは個別値の数を特定できない場合です。
| |
stakind | int2 | pg_statistic 行のN番目の「スロット」に保存されている統計情報の種類を示すコード番号。
| |
staop | oid |
| N番目の「スロット」に保存されている統計情報を引き出すために使われる演算子。
例えば、度数分布スロットはデータの並び換えの順序を定義する< 演算子を示します。
|
stanumbers | float4[] | N番目の「スロット」に対する適切な種類の数値統計情報、もしくはスロットの種類に数値が含まれない時はNULLです。 | |
stavalues | anyarray | N 番目の「スロット」に対する適切な種類の列データの値、もしくはスロットの種類にデータ値が何も保存されていない場合はNULL。
それぞれの配列要素の値は実際には特定された列のデータ型、もしくは配列要素の型といったような関連のある型になります。ですからanyarray とする以外に列型を定義することはできません。
|