これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。

pgroonga_flush関数

概要

pgroonga_flush関数はメモリー上にだけある変更を確実にディスクに書き込みます。この処理は自動的に行われるので、通常、この関数を使う必要はありません。しかし、クラッシュ・強制終了によるPGroongaインデックスの破損を防ぎたい場合はこの関数を使う必要があるかもしれません。

通常、ユーザーはサーバーを強制終了してはいけません。しかし、いくつか強制終了してしまうケースがあります。たとえば、Windowsアップデートにより意図せずにWindowsサーバーが再起動することがあるかもしれません。

もし、PGroongaを使っているPostgreSQLが強制終了したらメモリー上にだけある変更が失われるかもしれません。強制終了の前にpgroonga_flush関数を呼べばメモリー上にだけある変更がなくなります。つまり、ユーザーがPGroongaを使っているPostgreSQLを強制終了してもPGroongaのインデックスは壊れないということです。

もし、メモリー上にだけある変更が多い場合、pgroonga_flushの実行時間が長くなるかもしれません。これは使用しているディスクの書き込み性能に依存します。

構文

この関数の構文は次の通りです。

bool pgroonga_flush(pgroonga_index_name)

pgroonga_index_nametext型の値です。フラッシュ対象のインデックス名です。このインデックスはUSING pgroonga付きで作成してある必要があります。

pgroonga_flushは常にtrueを返します。なぜなら、もしpgroonga_flushが失敗したら値を返すのではなくエラーになるからです。

使い方

以下はサンプルのスキーマとデータです。このスキーマでは、検索対象のデータと出力対象のデータはどちらもインデックス対象のカラムです。

CREATE TABLE terms (
  id integer,
  title text,
  content text
);

CREATE INDEX pgroonga_terms_index
          ON terms
       USING pgroonga (title, content);

以下のようにpgroonga_flushを呼び出すことでメモリー上にだけあるpgroonga_terms_index関連の変更をディスクに書き出すことができます。

SELECT pgroonga_flush('pgroonga_terms_index') AS flush;
--  flush 
-- -------
--  t
-- (1 row)

存在しないインデックス名を指定するとpgroonga_flushはエラーになります。

SELECT pgroonga_flush('nonexistent');
-- ERROR:  relation "nonexistent" does not exist