他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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

表53.51 pg_statisticの列

列 型

説明

starelid oid (参照先 pg_class.oid

記述された列が属するテーブルもしくはインデックス

staattnum int2 (参照先 pg_attribute.attnum

記述された列数

stainherit bool

真の場合、統計情報には指定されたリレーションの値だけではなく、子テーブルの値も含まれます。

stanullfrac float4

NULL値である列項目の割合

stawidth int4

非NULL項目の平均保存幅(バイト単位)

stadistinct float4

列内で非NULL個別値を持つデータ数。 ゼロより大きい値は実際の個別値の数です。 ゼロより小さい値はテーブル内の行数に対する乗数を負にしたものです。 例えば、約80%の値が非NULLで、それぞれの非NULL値が平均して2回ほど出現する列はstadistinct = -0.4であると表現されます。 ゼロは個別値の数を特定できない場合です。

stakindN int2

pg_statistic行のN番目のスロットに保存されている統計情報の種類を示すコード番号。

staopN oid (参照先 pg_operator.oid

N番目のスロットに保存されている統計情報を引き出すために使われる演算子。 例えば、ヒストグラムスロットはデータの並び換えの順序を定義する<演算子を示します。 統計情報が演算子を要求しない種類であればゼロです。

stacollN oid (参照先 pg_collation.oid

N番目のスロットに格納された統計情報を派生させるために使われる照合順序。 たとえば、照合可能な列のヒストグラムスロットはそのデータをソート順を定義する照合順を表示します。 ゼロなら照合可能ではないデータです。

stanumbersN float4[]

N番目のスロットに対する適切な種類の数値統計情報、もしくはスロットの種類に数値が含まれない時はNULLです。

stavaluesN anyarray

N番目のスロットに対する適切な種類の列データの値、もしくはスロットの種類にデータ値が何も保存されていない場合はNULL。 それぞれの配列要素の値は実際には特定された列のデータ型、もしくは配列要素の型といったような関連のある型になります。ですからanyarrayとする以外に列型を定義することはできません。