[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 メーリングリストの案内