読者です 読者をやめる 読者になる 読者になる

LudiaでPostgreSQLに全文検索を(3) VACUUM / CLUSTER

ドキュメントにはこうある。

  • VACUUMには完全に対応していません。無効なTIDのチェックは行われますが、インデックスのサイズは減少しません。

VACUUM FULL を掛けると warning が出る。

# VACUUM FULL feed;
WARNING:  index "feed_ftidx" contains 80 row versions, but table contains 76 row versions
HINT:  Rebuild the index with REINDEX.

VACUUM FULL した場合は index を作り直した方がよさげ。

あと、PostgreSQL には CLUSTER という SQL がある。
http://www.postgresql.jp/document/pg814doc/html/sql-cluster.html

テーブルがクラスタ化されると、それぞれのテーブルはインデックス情報に基づいて物理的に並べ直されます。

これを使うと ctid が変わってしまうのだが……

# SELECT ctid, id, title FROM feed WHERE title @@ 'blog';
  ctid  | id |                 title
--------+----+---------------------------------------
 (1,14) | 42 | *** Blog *** *****
 (2,10) | 63 | Blog ** *******
  (2,4) | 57 | *********************************Blog

# CLUSTER feed_idx ON feed;
CLUSTER

# SELECT ctid, id, title FROM feed WHERE title @@ 'blog';
  ctid  | id |                 title
--------+----+---------------------------------------
  (0,9) | 42 | *** Blog *** *****
 (1,26) | 63 | Blog ** *******
 (1,17) | 57 | *********************************Blog
  (2,4) | 49 | *********************
 (2,10) | 20 | *******
 (1,14) | 61 | *******************

む。新しく ctid が振られた行は検索できるようになっているが、以前の ctid も Senna の index からは消えていないためか、もはやマッチしなくなっている行が引っかかってしまう。

CLUSTER を実行する際は、 index の作り直しが必須ですね。
# そう頻繁に実行するようなものじゃないけど。