Hatena::Grouppostgresql

PostgreSQL 雑記 このページをアンテナに追加 RSSフィード

2010-05-16LudiaのCLUSTER, REINDEXについて このエントリーを含むブックマーク このエントリーのブックマークコメント

Ludia のコードを読む機会があったのでメモを残しておきます。

textsearch_sennaではDROP INDEX, REINDEX, CLUSTER, 9.0以降はVACUUM FULLの際にインデックスが作り直されると、古いインデックスが使われないまま残されてしまいます (VACUUM は大丈夫) 。一方 Ludia では、DROP INDEX では同様なものの、REINDEX, CLUSTER ではゴミが残らないようになっていました。

PostgreSQL では削除の際に呼び出されるコールバックは無いので、なぜこんなことができるの不思議だったんですが、コードを見てみると 削除→作成 が同一トランザクションで呼び出された場合、作成のタイミングで削除待ちファイルリストを調べて Senna? のインデックスを削除しているようでした。裏ワザ的ではありますが、現状で実現可能な方法としてはアリかもしれません。

ところが、Ludia のロジックだとちょっとまずいところがあり、新しいインデックスの作成を待たず、かつトランザクションのコミットを待たない内に、古いインデックスを削除してしまいます。例えば、BEGIN → REINDEX → ROLLBACK の順で呼び出すと古いインデックスが復元できないという問題があるようです。「DDL もトランザクション対応すべき」というPostgreSQL の流儀から外れているので注意。特にメンテナンスコマンドが失敗またはキャンセルした際に、リトライして成功するまではインデックスが使えないことは運用者に伝えておく必要があるでしょう。

PostgreSQL にも、AtEOXact_xxx 関数群を呼び出しているあたりでフックがあると良いんですけどね……。