[groonga-dev,04148] PGroongaの検索で大量件数該当時のエラーについて

Back to archive index

tak_kaz24****@yahoo***** tak_kaz24****@yahoo*****
2016年 10月 13日 (木) 16:23:57 JST


はじめまして、高橋と申します。
PGroongaのWindows版を使用して全文検索システムを構築すべく動作検証をしております。
検証時以下のような事象が発生していますのでお手数ですが回答願えますでしょうか。

■環境
Windows Server 2008 R2 Standard SP1(64bit)
※メモリ4GBのVM環境
PostgreSQL9.5.4-1(Windowsインストーラ版使用)
pgroonga1.1.4(Windowsバイナリ版使用)

■現象
300件ほどのデータをテーブルに格納しSQLを発行したところ以下のようなエラーが発生し、
結果が返却されなかったりPostgreSQLから切断されたりといった事象が発生し、
最悪PostgreSQLの再起動が必要となります。
発生条件としてはSELECTの該当件数が多いほど発生しやすく、
特に以下のようなsnippet_html関数を使用するSQLですと高確率で発生します。

■実行したSQLの例
SELECT unnest(pgroonga.snippet_html(DOCUMENT_DATA, ARRAY[#SearchKeyword#])) AS SNIPPET_STRING FROM TARGET_TABLE WHERE DOCUMENT_DATA @@ #SearchKeyword#
※DOCUMENT_DATAカラムにpgroongaのインデックスを設定し、#SearchKeyword#に実際の検索語を設定

■SQL実行時のエラー
ERROR: pgroonga: failed to allocate memory for generating snippet
SQLステート:53200

■pgroonga.log
calloc fail (4194304)=0000000000000000 (C:\Users\kou\work\pgroonga\tmp\pgroonga-1.1.4\vendor\groonga\lib\io.c:1497) <22767> 
mmap failed!!!! in GRN_IO_SEG_REF(000000032560E4B0, 0): このコマンドを実行するのに十分な記憶域がありません。

■該当件数が多い場合にPostgreSQLインストールディレクトリのdata\pg_logに出力されるログ
ERROR:  index row requires 32920 bytes, maximum size is 8191

SQLの実行計画を取得すると件数が少ない場合Bitmap Index Scanでpgroongaのインデックスを使用していますが、
多い場合Index Only Scanを使用しておりこの時に8191バイト制限を超過してエラーとなるようです。
SET enable_indexonlyscan = offを実行してIndex Only Scanを無効にすると、
Index Scanを使用するようになりエラーにならないため回避は可能ですが速度としては落ちるため、
何か有効な対処方法等ありましたらご教示願えますでしょうか。
よろしくお願いします。




groonga-dev メーリングリストの案内
Back to archive index