pg_statistic

PostgreSQL 9.0.0文書
前のページ | 巻戻し | 第 45章システムカタログ | 早送り | 次のページ

# 45.36. `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`に対するビューで、既存のユーザが読んでも差し支えないテーブルの情報のみを開示しています。

表 45-36. `pg_statistic`の列

名前 | 型 | 参照先 | 説明
--- | --- | --- | ---
`starelid` | `oid` | ``pg_class`.oid` | 記述された列が属するテーブルもしくはインデックス
`staattnum` | `int2` | ``pg_attribute`.attnum` | 記述された列数
`stainherit` | `bool` |  | 真の場合、統計情報には指定されたテーブルの値だけではなく、継承関係の子の列が含まれます。
`stanullfrac` | `float4` |  | NULL値である列項目の割合
`stawidth` | `int4` |  | 非NULL項目の平均保存幅（バイト単位）
`stadistinct` | `float4` |  | 列内で非NULL個別値を持つデータ数。 ゼロより大きい値は実際の個別値の数です。 ゼロより小さい値はテーブル内の行数に対する負の乗数です。 例えば、平均して2回ほど出現する値を持つ列は`stadistinct` = -0.5であると表現されます。 ゼロは固有値を特定できない場合です。
`stakind`N`` | `int2` |  | `pg_statistic`行のN番目の"スロット"に保存されている統計情報の種類を示すコード番号。
`staop`N`` | `oid` | ``pg_operator`.oid` | N番目の"スロット"に保存されている統計情報を引き出すために使われる演算子。 例えば、度数分布スロットはデータの並び換えの順序を定義する`<`演算子を示します。
`stanumbers`N`` | `float4[]` |  | N番目の"スロット"に対する適切な種類の数値統計情報、もしくはスロットの種類に数値が含まれない時はNULLです。
`stavalues`N`` | `anyarray` |  | `N`番目の"スロット"に対する適切な種類の列データの値、もしくはスロットの種類にデータ値が何も保存されていない場合はNULL。それぞれの配列要素の値は実際には特定された列のデータ型になります。ですから`anyarray`とする以外に列型を定義することはできません。

前のページ | ホーム | 次のページ
`pg_shdescription` | 上に戻る | `pg_tablespace`