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