« NetBIOSのせいで見たくもない個人情報を見せられる | トップページ | インデックスの再構築タイミング(Informix) »

2014.04.03

WALを使わないテーブル

以前pg_xlogがパンクした、というエントリーを書いたときにちょっと調べたこと。

どうにかしてWAL(ログ先行書き込み:Write-Ahead Logging)に書く量を減らす/なくすことはできないものか、と。

特に大量データのCOPY/INSERT/DELETEをテストデータ準備などで必要とするときに、少しでも処理時間を稼ぎたかったのだ。

結論から言うとPostgreSQL 9.1以降であればWALを一切使わない、という定義は可能である。

◆UNLOGGED オプション


CREATE UNLOGGED TABLE hogehoge ();

この"UNLOGGED"オプションがWALを一切使わないテーブルという定義にすることが可能なオプションである。(Ver9.1以上対象)

こいつを行なうことでWALを使用しないため、更新処理の大幅な性能向上が期待できる。

これはディスクがへぼければへぼいほど有効だろう。

ちょいとPCで実験をしてみた。

環境は



-OS: Windows7(32bit)

-CPU: Celeron 857(1.2Ghz)

-Mem: 3GB

-HDD: シリアルATA 5,400rpm

-PostgreSQL: Ver9.1.6



1.同じ構造のテーブルに対して、350万行をINSERT処理

2.350万行あるテーブルに対して、300万行に対して2項目の数値型データを更新する処理

Noログ有りログ無し
150,809ms17,597ms
2126,633ms20,451ms

というわけで、2~6倍の性能をたたき出すことがわかった。
もちろん、これはディスクシーク性能などにも影響されるので、その点今回はわかりやすい環境を使用したので、注意が必要である。

もちろん、UNLOGGEDにするとPITRの恩恵にあずかれなくなるので、どのテーブルに対して使用するのか、というのは慎重な見極めが必要であるが。

DBMSによっては、こうしたトランザクションログを記録しない方式のテーブルについてはトランザクションをかけることができないものもあるが(Informixとか)、PostgreSQLにおいてはUNLOGGEDテーブルであってもBEGIN/COMMITが可能であるのでご安心を。

なお、UNLOGGEDオプションはALTER TABLEでは実施できないので、既存テーブルをUNLOGGEDに変更したい場合はDROP後再度CREATEすることになる。
よくやる手は別名でテーブルを作成し、データを突っ込んだ後に名称変更と元のテーブルのドロップをする、という手順になるだろう。

|

« NetBIOSのせいで見たくもない個人情報を見せられる | トップページ | インデックスの再構築タイミング(Informix) »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: WALを使わないテーブル:

« NetBIOSのせいで見たくもない個人情報を見せられる | トップページ | インデックスの再構築タイミング(Informix) »