日々のくだらない話題について


by jinotaro
カレンダー
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

RAMDISK上でPostgreSQL8.3を使うと?

前回のブログでOSが使用しない領域をつかって2.5GバイトのRAMディスクを生成した。そこでこのRAMDISKの爆速ぶりを実際のプログラムでどのくらい体感できるのかを調査するためにPostgreSQL8.3でTABLESPACEをRAMDISKとHDDの上に生成して比較してみることにしてみた。

1.まずはTABLESPACEを作成。
まずは以下のSQLを発行してテーブルスペースをHDDとRAMDISKの上に生成する。

create tablespace diskspace location 'd:\\pgdata\\'; -- HDD上
create tablespace ramspace location 'r:\\pgdata\\'; -- RAMDISK上

2.テーブル作成
次にテーブルを作成。郵便番号データを突っ込むことを想定。

create table zip_xxx (
zipid serial primary key,
code char(5), -- JISCODE
oldzip char(5), --旧郵便番号
newzip char(7), --新郵便番号
addrf1 varchar, --都道府県カナ
addrf2 varchar, --市区町村カナ
addrf3 varchar, --その他カナ
addrk1 varchar, --都道府県カナ
addrk2 varchar, --市区町村カナ
addrk3 varchar, --その他カナ
tmp1 char(128), --updateテスト用
) TABLESPACE xxxxx;

ここではzip_xxx としてあるが、実際はRAMDISK上のものをzip_ram、HDD上のものをzip_diskとしてテーブルを生成した。

3.データを突っ込む

困った時の郵便番号辞書、ということで、日本郵便のホームページから郵便番号辞書をダウンロードする。で、突っ込んでみたら全然Diskを消費してくれない(30Mもいかない)。全部で122,489行あったのだが、仕方ないので60回Insertを繰り返して734万行のデータにした。この時点でテーブルスペースの容量は1.15GB程度である。

4.テストの準備開始
このままテストすると、3.5Gあるメインメモリ側のディスクキャッシュに全部入ってしまうのでPerlで2.5GBほどメインメモリを消費するプログラムを生成する。これでキャッシュが500MB程度に抑制される。テスト環境は以下のとおり。

CPU: Core2Duo E6600(2.4GHz)
Memory: 6G(OS:3.5G RAMDISK: 2.5G)
OS: Vista Ultimate
HDD: Seagate社製 ATA規格 750GB(ST3750640A)

■テスト1
730万行のデータをそれぞれの間でフルコピーしてみる。

RAM->DISK: 225.29秒
DISK->RAM: 191.407秒

■テスト2
全件カウントする。
select count(*) from zip_xxx;

RAM: 6.75秒
DISK: 17.48秒

■テスト3
gruop by何ぞ使用。
select addrf2,count(*) from zip_xxx group by addrf2;

RAM: 5.53秒
DISK: 17.78秒

■テスト4
インデックスのないフィールドにフルテキスト検索をかける
select count(*) from zip_xxx where addrf3 like '%キタ%';

RAM: 4.36秒
DISK: 17.42秒

■テスト5
百万行を超えるデータに対してアップデート
update zip_xxx set tmp1=newzip where addrk1 like '%大%' or addrk1 like '%福%' or addrk3 like '%北%';
この条件で1,107,180行更新された。

RAM: 227.13秒
DISK: 410.97秒

■■■ 感想 ■■■

思ったほどRAMDISK上へのDBアクセスが速くないというべきか、HDDでも十分速いじゃんというべきか。電源断と同時に中身が消えてしまうリスクを背負うほど早くないのね。今回使用したHDDは旧世代でATA規格ということもありそんなに早くはない。DBのアクセス時に重要とされるランダムアクセス性能がベンチマーク上では100倍以上速いはずなのにそれが生きてこない結果となった。これならSASのHDDをRAID0で使ったほうが運用は楽だし、速度と運用のバランスがとれそう。

まぁそれでもSELECTで3倍、UPDATEでも2倍程度高速化しているのは立派である。データウェアハウス的な使い方をするならば有効でしょうね。なんとなく今回の結果には納得がいっていないので、そのうちMySQLか何かで追試します。
[PR]
by jinotaro | 2008-05-12 10:01 | server