これは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_name
はtext
型の値です。フラッシュ対象のインデックス名です。このインデックスは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