非同期コミットは、小さなトランザクションが多数流れる環境では非常に効果があるが、長大なトランザクションでは効果がない。非同期コミットと言っても、いずれはトランザクションログを書かなければならないからだ。

しかし、マスターデータから初期データをロードするようなケースでは、この問題をうまく解決する方法がある。

マスターデータを初期ロードするためには、作成した直後の1テーブルに、COPYでデータをロードする事が多い。このようなケースでは、以下のようにすると格段にロードが速くなる。

BEGIN;
CREATE TABLE...
TRUNCATE TABLE...
COPY...
END;

全体をトランザクションで囲み、CREATE TABLEの直後にTRUNCATEを実行するのがポイントだ。このようにすると、トランザクションログが出力されないため、非常に高速になる。実際、PostgreSQL 8.3に附属するpgbenchでは、このテクニックが使われており、pgbenchによる初期データのロードが格段に高速化されている。

ちなみに、このようにトランザクションログの出力を省略しても、障害時にデータベース全体のデータの整合性がなくなってしまうような懸念はまったくない。信頼性を損わず、性能だけがあがる良い方法なので、ぜひ活用してほしい。