[pgsql-jp: 34275] Re: pgstattupleの出力結果について
Tatsuo Ishii
t-ishii @ sra.co.jp
2004年 11月 15日 (月) 22:03:11 JST
石井です.
> PostgreSQL7.3.4でpgstattupleを使用して、データベースの使用量、空き、
> 不要領域を取得しようとしています。
>
> table_len -- physical table length in bytes
> tuple_count -- number of live tuples
> tuple_len -- total tuples length in bytes
> tuple_percent -- live tuples in %
> dead_tuple_len -- total dead tuples length in bytes
> dead_tuple_percent -- dead tuples in %
> free_space -- free space in bytes
> free_percent -- free space in %
>
> READMEにある上記説明をよみ、
>
> table_len=テーブルサイズ
> tuple_len=テーブル使用量
> dead_tuple_len=テーブルの不要領域量
> free_space=テーブルの空き容量
>
> として計算させています。
>
> しかし、以下出力例にもあるように、tuple_len+dead_tuple_len+free_space
> の結果がtable_lenと一致せず、%の合計も100になりません。
>
> test=# select * from pgstattuple('pg_proc');
> -[ RECORD 1 ]------+-------
> table_len | 458752
> tuple_count | 1470
> tuple_len | 438896
> tuple_percent | 95.67
> dead_tuple_count | 11
> dead_tuple_len | 3157
> dead_tuple_percent | 0.69
> free_space | 8932
> free_percent | 1.95
>
> このような結果になるのは仕様でしょうか?
これ以外に使えない領域があります.
1) ページ毎の固定長管理領域(ページヘッダ)
これは7.3の場合,各ページ毎に20バイトあります.ページ数は
458752/8192=56ですから,全部で20*56=1120バイトになります.
2) タプルへのポインタデータ
タプル毎に4バイト必要なので,4*1470+4*11=5924.
1)と2)を考慮すると,438896+3157+8932+1120+5924=458029
これでも458752-458029=723バイト合いませんが,これらは以下の要因による
ものと思われます.
a) 直前のタプル長が4バイトバウンダリになっていないときは,次のタプルは
4バイト単位に切り上げられる(「4」は普通のx86 PC Unix/Linuxの場合).
b) そのページの残りスペースが4バイト未満のときには,フリースペースが0
とみなされる
# 他にもあったかな?
--
Tatsuo Ishii
pgsql-jp メーリングリストの案内