現在開発中のPostgreSQL 8.3は,まもなく「フィーチャーフリーズ」(機能の確定)となる。5月中にはβテストに入り,早ければ7月にも正式リリースがありそうだ。

 8.3では,性能面に関する大幅な改良がある見込みだ。中でも注目されているのがHOT(Heap Only Tuples)である。

HOTとは

 HOTは一口で言うと,PostgreSQLの更新性能を改善する仕掛けである。HOTについて説明する前に,なぜPostgreSQLの更新性能が問題になるのか説明しよう。

PostgreSQLの更新処理の弱点

 PostgreSQLは追記型のアーキテクチャを採用しており,更新は,内部的に削除してから新しい行を追加することで実装されている。削除して不要になった行はVACUUMコマンドで再利用可能領域として回収,再利用される。更新処理を頻繁に行う場合はVACUUMも頻繁に実行しなければならない。でないと不要領域がどんどん増えてテーブルが肥大化し,性能が劣化する。

 VACUUMMはテーブルの全データをスキャンする処理なので,テーブルの大きさに比例して処理時間が増大する。したがって,テーブルが大きくかつ更新頻度が多いと,いくら頻繁にVACUUMを実行しても更新処理で生み出される不要領域の回収が追い付かなくなる。

 問題はこれだけではない。

 更新処理ではテーブル本体だけでなく,インデックスも更新しなければならない。PostgreSQLでは,ある列に更新があると,関連するインデックスもすべて更新される。したがって,インデックスがたくさんあるテーブルでは更新処理の量も格段に増え,インデックスもどんどん肥大化する。インデックスの不要領域はVACUUMによって再利用されにくい場合もあるので,テーブルよりも問題が深刻になることがある。

HOTで不要領域の増加を削減

 HOTはこうした問題を解決するために考案された新しい更新処理のアルゴリズムだ。HOTによって,テーブルの肥大化だけでなく,インデックスの無用な肥大化も防ぐことができる。