PostgreSQL 8.1のベータ2が9月18日にリリースされ,PostgreSQL 8.1のベータ
テストもいよいよ佳境に入ってきた。今回は今まで紹介しきれなかった8.1の
細かな改良のうち,面白そうなものを取り上げていこう。
なお,本稿の内容は PostgreSQL 8.1beta2に基づいており,正式リリース時に
は変更があるかもしれないことをあらかじめお断りしておく。
集約関数の高速化
従来,集約関数を実行する際に,行からデータを取出すたびにメモリーを獲得し,
その結果を集約(例えばsum()なら加算する)ということを行っていた。8.1で
は,必要がなければこのメモリー獲得をやめることによって集約関数のオーバヘッ
ドの低減した。実際にpgbenchで作成した10万件のデータで実験してみた結果,
以下のようなデータが得られた。数字は実行時間で,単位はミリ秒である。
8.0 8.1 8.1/8.0の比率(%)
--------------------------------------------------------
count(*) 142.027 96.791 68.14
sum(aid) 146.714 104.640 71.32
avg(aid) 158.817 105.953 66.71
stddev(aid) 659.824 658.233 99.75
variance(aid) 658.429 658.241 99.97
--------------------------------------------------------
この例ではcount(), sum(), avg()が8.1で3割程度の高速化している。一方,
stddev(), variance()では有意な差は見られなかった。これは,stddev(),
variance()では計算が複雑であるため,そのオーーバヘッドで改善効果が出なかっ
たのではないかと考えられる。
また,実際の業務で使うテーブルは,もっと列数が多く,1行あたりのサイズ
が大きくなるため,I/O時間にマスクされて,今回の実験ほどには顕著に効果
が顕れないかも知れない。実際にテストしてみることをおすすめする。
トランザクションログ関係の改善
トランザクションログ回りでいくつかの改善が行われている。
CRC計算の32ビット化
トランザクションログの正確性を保つことは,データベースの信頼性にかかわる
重要な課題である。間違ったトランザクションログでリカバリが行われると不
正確なデータができてしまうからである。そのため,OSやハードウエアなどの
障害によってトランザクションログが改変されてしまったことを検出するため
に,PostgreSQLではCRCという手法を使って誤り検出ができるようになってい
る。従来この計算は64ビットで行われていたが,計算負荷が高い割には効果が
薄いため,8.1では32ビットで計算するように改められた。
新しい制御パラメータ「full_page_writes」
PostgreSQLでは,クラッシュリカバリを確実なものにするために,タイミング
によっては更新分だけでなく,ページイメージ全体をトランザクションログに
書き込むことがある。full_page_writesをoffにすることにより,この処理を
省いて高速化,ディスクスペースを節約することができる(ハードディスクの
キャッシュがバッテリーバックアップされている場合はfull_page_writesを
offにしても実際問題としてリカバリが失敗するようなことは起きない)。
fsyncのパラメータに「O_DIRECT」が追加
トランザクションログの同期書込方法を指定するfsyncパラメータに
「O_DIRECT」が追加された。O_DIRECTを指定するとカーネルのバッファ管理を
バイパスするため,トランザクションログへの書き込みが高速化できる。
CREATE TABLE AS/SELECT INTOでトランザクションの書き込みの省略
CREATE TABLE ASやSELECT INTOでは処理途中でクラッシュしても,リカバリ時
に中途半端なテーブルは削除されるため,トランザクションログからのリカバ
リは必要ない,ということでCREATE TABLE AS/SELECT INTOでトランザクショ
ンの書き込みが省略され,高速化された。
ただし,アーカイブログを有効にしている場合は従来通りログは取得される。
また,PostgreSQL8.1では,かなりの数の新しい組み込み関数が追加された。