[pgsql-jp: 30024] Re: 使用しているファイルサイズを調べたい

Emiko Kishi kishi @ b-b-net.com
2003年 5月 22日 (木) 17:19:01 JST


おつかれさまです、岸です。
いつもお世話になっております。

先週、表題の件でアドバイスをいただいた後、
ダミーデータの投入・実測値計算を行い、論理値と比較してみました。

ですが、実測値が論理値を大きく上回ってしまいました。
あまりにも差が大きいので、どこかが間違っているのだと思います。
いろいろと理由を考えたり調べたりしてみたのですが、
ハッキリした原因は突き止められませんでした。
# 大きなサイズのtextフィールドが圧縮されていないようにも
# 思えるのですが、そんなことってあるのですか?

なにか手がかりに思い当たられる方がいらっしゃいましたら、
アドバイスをいただけませんか?

環境は、PostgreSQL 7.2.3 (FreeBSD 4.7 / Apache 1.3.27)です。

以下に、行った手順を書きます(長文で失礼します):

ダミーデータは、PKEYを設定した状態のテーブルに
1件のINSERTを行うSQLを、スクリプトでループさせて投入しました。
全部で1539件を投入したところで一旦REINDEXを行いました。
(最後の数件は、運用予定のperlCGIでフォームから入力しました)

テーブル「sample」は下記の通りです。
論理値計算の割り算は、最終的な結果が大きくなるように丸めました。
Column  Type                  投入データ         論理値計算
======= ===================== ================== ================
num1    integer               連番、PKEY                        4
num2    integer               数値        10byte                4
char1   character varying(12) 半角英数字  12byte        12+4 = 16
text1   text                  全角文字 0〜14byte        12+4 = 16
text2   text                  全角文字    40byte        40+4 = 44
text3   text                  全角文字  2000byte (2000+4)/30 = 67
bool1   boolean                                                 1
bool2   boolean                                                 1
-----------------------------------------------------------------
                                    論理値合計                153
                                    フィールド間       4 * 7 = 28
                                    行ヘッダ                   32
                                    NULLビットマスク            4
                                    タプルへのポインタ          4
                                    -----------------------------
                                    1タプルのサイズ           221
                                    1ブロックのタプル数        37
                                    1539件のブロック数         42

インデックス「sample_pkey」は下記の通りです。
Column  Type                  投入データ         論理値
======= ===================== ================== ================
num1    integer               連番、PKEY                        4
-----------------------------------------------------------------
                                    論理値合計                  4
                                    フィールド間                0
                                    行ヘッダ                   32
                                    NULLビットマスク            4
                                    タプルへのポインタ          4
                                    -----------------------------
                                    1タプルのサイズ            44
                                    1ブロックのタプル数       186
                                    1539件のブロック数          9

VACUUM ANALYZEした直後に、pg_classでタプルとページを調べました。
relname                  reltuples relpages
======================== ========= ========
sample                        1539       42
sample_pkey                   1539        6

indexはともかくとして、概ね予想通りと思っていたのですが、
[pgsql-jp: 29895]で教えていただいたスクリプトを見て、
TOASTテーブルも考慮しなければならないと思い、調べてみました。

relname                  reltuples relpages
======================== ========= ========
pg_toast_sampleのoid          3072      793
pg_toast_sampleのoid_idx      3072       20

これを足すと、論理値と比較してあまりにもサイズが大きすぎるので、
以下のようなSQL文でデータのサイズを調べてみました。

select avg(octet_length(text3)), avg(char_length(text3)) from sample;
       avg       |       avg
-----------------+-----------------
 1997.6179337232 | 1997.6179337232

# 2000より少し少ないのは、手入力した数件のデータが
# 2000byteよりもだいぶ少なかったためと思われます。
# このSQL文は、過去ログのtextの圧縮についての投稿を参考にしました。
# http://ml.postgresql.jp/pipermail/pgsql-jp/2002-October/002880.html

textの圧縮が行われていないように思えるのですが、本当にそうなのでしょうか
?
(圧縮をさせないような設定は何も行っていません)
それとも、この結果が正しくて論理値の計算の方が間違っているのでしょうか?

もっと根本的なところがわかっていないのかも、と思っています。

ここを勉強するとわかるよ、というポインタ等でもかまいませんので、
手がかりを教えていただけませんか?

よろしくお願いします。

-----
岸恵美子 kishi @ b-b-net.com






pgsql-jp メーリングリストの案内