[pgsql-jp: 25025] Re: HDDサイズ
sugita @ sra.co.jp
sugita @ sra.co.jp
2002年 3月 1日 (金) 11:13:55 JST
From: "Hiroyuki Yamada" <hiroyuki @ rh.is.hitachizosen.co.jp>
Subject: [pgsql-jp: 24875] HDDサイズ
Date: Thu, 21 Feb 2002 12:09:34 +0900
;;; 山田@京都です。
;;; みなさん、こんにちは。
;;; 150GB程の情報をPostgreSQL7.1.2等で管理出来ないかとおもっているのですが、大
;;; 体、どの位の容量のHDDを考えておけば
;;; いいのかご教授ねがいませんでしょうか?
;;; (テーブル数は、いまのところ1つ、レコード数250万なのですが、検索など出来る
;;; のか少し心配なので、なにかアドバイスがあれば、よろしくお願いします。)
PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ)
4.7) 一般的なテキストファイルからデータを保存するには、データベースのディ
スク容量はどのくらい必要です?
上記のソースコード内の doc/FAQ_japanese に説明がありますが、少し詳しく調べた
メモです。まだ不正確な部分もあると思うので、御指摘願います。
================================================================
* 圧縮のない場合のテーブルサイズの概算見積もり方法
int4 の 1 フィールドのテーブルで 10 万レコードの場合の見積もりは以下のよう
になります。
32 + 4 + 4 + 4 = 44 … レコードサイズ。
各行のヘッダ 32 バイト
+ フィールド数 32 で、NULL 値がある場合の NULL ビットマスク
+ ページ内のタプルへのポインタ
+ int4 のサイズ
8192 / 40 = 187 … ブロックあたりのレコード数。
データベースページ数 /レコードサイズ。
100000 / 187 = 535 … ブロック数。
レコード数 / ブロックあたりのレコード数。
535 * 8192 = 4382720 … テーブルファイルサイズ。
ブロック数 * ブロックサイズ。
実測例を以下に示します。
レコード数 テーブルファイルサイズ
========== ======================
100000 4022272
200000 8036352 (+4014080)
300000 12050432 (+4014080)
400000 16064512 (+4014080)
500000 20078592 (+4014080)
約 -8% の誤差は、ページ内のページ管理情報とNULL 値のための NULL ビットマス
クが全行に必要として見積もったため。
圧縮のある場合には、以降の「データ圧縮」の項を適用します。
フィールドが NULL 値かどうかを判断するNULL ビットマスクによって、NULL 値の
場合には値を格納する領域はタプル内に取られません。従って、ビットフラグが存
在し、すべてのフィールドについてタプル内に格納領域が必要として見積もりをす
るならば、実測値を下回る可能性は少なくなります。
NULL ビットマスクサイズは全フィールドが NULL の場合には 0 で、32 フィール
ドごとに 4 バイトずつ増加します。つまり、1〜32 フィールドで 4 バイト、33〜
64フィールドで 8 バイトとなります。
* インデックスサイズの見積もり
レコード辺りのオーバーヘッドが 12 としテーブルと同様に算出します。
12 + 4 = 16
8192 / 16 = 512
100000 / 512 = 195
195 * 8192 = 1597440
実測例を以下に示します。
レコード数 インデックスファイルサイズ
========== ==========================
100000 1810432
200000 3612672 +1802240
300000 5406720 +1794048
400000 7200768 +1794048
500000 8994816 +1794048
約 +10% の誤差があります。この誤差は、インデックスファイル内のインデックペー
ジが 100% 埋まることがないために発生します。
* 主なデータ型の格納サイズ
データ型名 データベース上のバイト数
---------------------- -------------------------------
smallint 2
integer 4
bigint 8
decimal 圧縮 (サイズは値の桁数に依存)
numeric 圧縮 (同上)
real 4
double precision 8
serial 4 (7.2 では 8 の serial あり)
boolean 4
character(n) 圧縮
character varying(n) 圧縮
text 圧縮
timestamp 8
time with time zone 8
interval 12
date 4
time 8
time with time zone 12
* データ圧縮
以下の 3 つのデータ型の圧縮率は同一です。
character(n)
character varying(n)
text
以下の 2 つのデータ型の圧縮率は同一です。また、圧縮率は値の桁数の 1/2 の長
さの text の圧縮率とほぼ同等です。
decimal
numeric
text の圧縮率の例は以下の通りです。
ランダムな 1000 文字の漢字文字列 (圧縮率約 1/30)
レコード数 テーブルファイルサイズ
========== ======================
10000 688128
20000 1368064 +679936
30000 2048000 +679936
40000 2736128 +688128
50000 3416064 +679936
ランダムな 2000 文字の英字文字列 (圧縮率約 1/30)
レコード数 テーブルファイルサイズ
========== ======================
10000 688128
20000 1368064 +679936
30000 2048000 +679936
40000 2736128 +688128
50000 3416064 +679936
* データベースのサイズに影響する主な要因
データベースのサイズは以下の要因により動的に変化します。
1) 更新の頻度 (テーブルファイルとインデックスファイルに影響)
2) ソートを必要とするクエリーのワークファイル
3) テンポラリテーブルの使用の有無
4) WAL ファイルサイズ
5) REINDEX のワークファイル
6) バックアップ領域などの付随的なワーク領域
従って、静的なサイズの見積もりに加え、運用シナリオを作成し、実験を行ってディ
スク使用量を見積もります。特に 1) は PostgreSQL の追記型という特徴を反映し
た影響を受けるので、VACUUM の適用と合わせて運用設計を行います。
* 参考資料
1) データ圧縮
「PostgreSQL 完全攻略ガイド 第 3 版」の P.94〜95。
7.2 では octet_length の戻り値が変更され圧縮された値でなく、データ
の実際のバイト数となっていることに注意。
2) データのデータベース上のバイト数
「PostgreSQL 7.1.3 ユーザーズガイド」の「3. データ型」を参照。
3) doc/FAQ_japanese
PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ)
4.7) 一般的なテキストファイルからデータを保存するには、データベースの
ディスク容量はどのくらい必要です?
4) 次の資料の P. 39〜P. 41。
http://candle.pha.pa.us/main/writings/pgsql/performance.pdf
================================================================
Kenji Sugita
sugita @ sra.co.jp
pgsql-jp メーリングリストの案内