Kouhei Sutou
kou****@clear*****
2017年 11月 25日 (土) 15:26:40 JST
須藤です。 In <009601d3632c$19f083e0$4dd18ba0$@mirror.ocn.ne.jp> "[groonga-dev,04533] JSONB や 配列フィールドについての pgroonga インデックス作成時間および、jsonb のフェッチについて" on Wed, 22 Nov 2017 09:51:58 +0900, 内山敏郎 <toshio_uchiy****@mirro*****> wrote: > 〇質問1:インデックス作成時間 同じデータ量だけどインデックスの作成時間が、 * textに全部詰め込むと20分 * jsonbでJSONの配列として100個にわけて詰め込むと40分 * text[]に100個にわけて詰め込むと100分以上 になるけど、妥当?という話ですよね。 textとjsonbの比較ですが、jsonbの方がインデックス化している情 報が多い(たとえば、JSON内のどこにあるデータか、という情報も インデックス化している)ので遅くなるはずです。ただ、2倍くら いになるのが妥当かというとどうなんだろう、試さないとわからな い、という感じです。 text[]がすごく遅いのは妙だなぁと思いました。 ↓のようにcontentカラムだけにして実行しても再現しますか? create table subtitled (content text[]); create index pgroonga_subtitled on subtitled using pgroonga( content ); insert into subtitled ...; これでも再現するならこちらでも確認してみたいので、データを提 供してもらえないでしょうか? また、↓のようにデータ投入後にインデックスを作成するとどうな りますか? create table subtitled (content text[]); insert into subtitled ...; create index pgroonga_subtitled on subtitled using pgroonga( content ); > 〇質問2:検索結果でデータ量の多いjsonb フィールドのフェッチ時間 > > 上記の subtitlec で、content &@ 'アルゴリズム' の検索結果がおよそ1700件 > です。この検索結果をフェッチすると45秒かかりました。explain analyze > で時間を測定すると(フェッチしないと)数十ミリ秒です。 > 加えて、&@~ 'アルゴリズム 検索' として 4件まで絞り込むと > フェッチしても1秒かかりません。 > > この測定傾向も、理論的に正しいと考えられますでしょうか。 該当レコード1700件のidを記録しておき、 SELECT content WHERE id IN (...idのリスト...); を実行した場合も45秒くらいかかりますか?であれば、そのくらい かかって普通です。 PGroongaは数値や文字列など多くの型に対してはインデックスオン リースキャンをサポートしており、PostgreSQLのストレージからで はなくPGroongaから実データを返しています。この場合は、 PostgreSQLからデータを返すときよりも速いはずです。 (そういえばベンチマークをとったことがなかったので誰かとって まとめて欲しい。。。) 一方、jsonbではインデックスオンリースキャンをサポートしてい ません。これは、PGroongaはjsonbの元データを保存していないか らです。インデックスオンリースキャンをサポートしていないので クライアントにjsonbのカラムの値を返すのは常にPostgreSQLです。 なので、PostgreSQLがデータを返すのに45秒くらいかかるなら、 たとえPGroongaのインデックスを使って検索したとしても同じくら いかかります。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ OSS開発支援サービス: http://www.clear-code.com/blog/2016/6/27.html