(注:記事は執筆時の情報に基づいており,現在では異なる場合があります)

図2●VACUUMの必要性
PostgreSQLは追加方式を採るため,不要データ領域を再利用する処理「VACUUM」を定期的に行う必要がある。(1)不要領域を登録して再利用可能にする通常のVACUUM,(2)テーブルをロックし不要領域を物理的に削除するVACUUM FULLの2種類がある
図3●設定ファイルでキャッシュ・サイズなどを最適化する
デフォルトでは最低限のハードウエアでも動作するような設定になっている。CPUのクロックが1GHz程度,マルチプロセッサ構成,メモリーが512Mバイトのマシンで,Web用のデータベースとして使うことを想定した設定ファイルの推奨値
図4●PostgreSQL特有のSQL文の注意点またはチューニング方法
インデックスはすべてBtreeを使うものとする

不要領域の回収「VACUUM」が運用の要

 PostgreSQLの運用の要は,データベースの不要領域を回収して,再利用可能にする処理などを行う処理である。VACUUMと呼ぶコマンドにより行う。VACUUMの利用方法を誤ると極端なパフォーマンスの劣化を招くことがある。筆者の経験では「PostgreSQLを使っているんだけど,遅くて…」という場合,半分以上のケースではVACUUMの使用方法の誤りが原因だった。

 PostgreSQLは行を削除・更新した場合,その行をすぐに物理的に削除したり,更新するのではなく,その行に「削除マーク」を付け,更新の場合は新しい行を追加するという方式を取る。これを「追記方式」と呼ぶ(図2[拡大表示])。

 追記方式は読み取り一貫性を実現する基盤になっているだけでなく,障害時のリカバリが容易であるというメリットがある。その半面,削除マークが付いた不要データをどう扱うかという問題がある。不要データを放置しておくと物理的なテーブル・サイズが大きくなり,ディスク領域を圧迫するだけでなく,性能が劣化するからである。

 VACUUMはこの問題を解決する。VACUUMには大きく分けて2つのタイプがある。

 ひとつは,通常のVACUUMで,不要領域をチェックし,再利用するためにFSM(Free Space Map,空き領域マップ)という共有メモリー上の領域に不要領域の場所と大きさを登録する。不要領域の物理的な削除は行わない。

 2つめはVACUUM FULLというコマンドで実行する機能である。これは不要領域を削除するため,ディスク領域を回復できるが,実行中はテーブルが完全にロックされるので利用は制限される。実行時間もかかる。

 通常使うのは前者の方で,この場合はVACUUMに「FULL」オプションを指定しない。このタイプのVACUUMはテーブルをロックしないので,業務に支障なく利用できる。

 データを追加する際は,まずFSMが検索され,適当な大きさの不要領域が見つかれば再利用される。FSMに登録された不要領域を使い切ると,再利用が行われなくなるので,定期的にVACUUMを実行してFSMを「補給」しなければならない。標準的なVACUUMの実行頻度としては,忙しいシステムで1時間ごと,暇なシステムで1日1回というのが一つの目安になろう*6

設定ファイルやSQL文によるチューニング

 PostgreSQLの設定ファイルpostgresql.confのデフォルト値は最低限のハードウエアでも動作するような設定になっており,高性能のハードウエアを生かすことができない。CPUのクロックが1GHz程度,2CPU構成,メモリーが512Mバイト以上あるハードウエアで,Web用のDBMSを想定した推奨値を図3[拡大表示] に示す。

 なお,通常のLinuxカーネルの設定では,図3[拡大表示]のpostgresql.confの設定ではPostgreSQLが立ち上がらないことがある。共有メモリーなどの設定を変更しておくことをお勧めする。設定ファイル/etc/sysctlのRedHat系ディストリビューションでの設定例も図3[拡大表示]に示しておく。

 ただし,設定ファイルによるチューニングで得られる性能改善はせいぜい数倍である。DBMSの性能を最も左右するのは実はSQL文の書き方やインデックスの設定であり,数十倍や数百倍の改善がみられることもある。

 「速いSQL文」を書くためには,適切にインデックスを設定し,EXPLAINを使うなどしてデータベース・エンジンの動作を調べる必要があるが,そのためにはオプティマイザに関するある程度の知識が必要で,限られた誌面で解説するのは無理である。そこで,逆に「不用意にこれをやると確実に遅い」というSQL文のパターンとその対策を図4[拡大表示]にいくつか紹介しておく。

 図に挙げたほかにも「関数の実行結果に対する検索が遅い場合は,関数インデックスを設定する」,「異なるデータ型の比較ではインデックスが使用されないため,型変換により型を一致させて比較する」なども重要なポイントである。

      *         *         *

 駆け足でPostgreSQLを活用するポイントを述べてきた。PostgreSQLは工夫次第で大規模な業務でも十分使用できる水準に到達しているというのが筆者の感想である。

 今後は本稿で述べたポイントを意識しなくても,誰でも十分な性能を引き出せるようになることが期待される。そのための開発作業はすでに着々と進んでいる。例えば,VACUUMを必要な時に自動的に実行する機能は,次のバージョンである7.4に搭載される予定である。

(次回に続く)

石井達夫(いしい・たつお)氏

1984年,SRA入社。主にUNIX関連の開発に従事するかたわら,95年からPostgreSQLのメーリング・リストを主宰。現在はオープンソースソリューション部でPostgreSQL関連のビジネス活動の技術支援を担当。著書に『今すぐ導入!PHP×PostgreSQLで作る最強Webシステム』,『PostgreSQL完全攻略ガイド』(技術評論社),『PHP4徹底攻略』(ソフトバンクパブリッシング,共著)などがある。日本PostgreSQLユーザ会理事長。

オープンソースのデータベース管理システム「PostgreSQL」の導入方法から,ユーザー事例,運用・管理方法,Oracleデータベースとの機能・性能の比較や移行方法までを解説した,日経Linux別冊『PostgreSQL 構築・運用ガイド』。PostgreSQL(石井達夫氏)とOracle(山田精一氏)の第一人者による,PostgreSQL活用の実践書。