Archive for 2010年6月

PostgreSQLのパーティショニングではまった記録

2010/06/25

PostgreSQLにはパーティショニングという機能があって、ひとつの論理テーブルを複数の物理テーブルに分割して格納する仕組みがある。このところのバージョンでどんどん使いやすくなっている機能のひとつ。

私の管理するPostgreSQLデータベースのひとつで、この機能を使いつつ運用していたものがあるのですが、最近そのデータベースでの更新(UPDATE)がうまくいっていないという報告を受けたので調査すると、パーティションを跨ぐような更新をしようとしてエラーになっていた。

もちろん元々の設定のときにこの考慮はしてあって、元データを削除した上で新規に挿入する更新トリガをセットしていたのですが、どうもこのトリガが動いてない様子。

どうして動かないのか、エラーメッセージ(メッセージ残してないんだけど、保存しとけばよかった。検索でヒットしないじゃないか)を睨みつつ考えていると、更新トリガを貼る表を間違ってるんじゃないかと思いついた。そう。更新トリガは、パーティションテーブルに対して貼らなければならないのではないかと。

これが正解で、その通りに変更してみると期待通りに処理され出した。後でドキュメントをよく読むと、ちゃんと「このような(筆者注:別のパーティションに移るようなUPDATE)場合を扱うには、適切な更新トリガをパーティションテーブルに設定します」と書いてあった。

以前はマスターテーブルに対してトリガをセットしていたんですが、これじゃあ駄目だったんですね。テストでやってたときは上手く動いてたっぽいんだけどなぁ。

あ、挿入トリガはマスターテーブルに貼るんですよ。将来の自分に念のため。