[groonga-dev, 04474] Re: shared buffers hit vs read after >cat pgrn* /dev/null

Zurück zum Archiv-Index

toshio_uchiy****@mirro***** toshio_uchiy****@mirro*****
2017年 9月 12日 (火) 10:01:41 JST


須藤さま

 お世話になります。内山です。

 最初に、pg_prewarm ですが、所望の結果が得られました。

再起動後、cat pgrn* > /dev/null と pg_prewarm を実行してから
検索を実行すると、explain ( analyze, buffers ) において、
全件 shared hitになり、read はありませんでした。検索も
pg_prewarm を実行しない場合に比べて早くなりました。

もう一つ、演算子ですが、like だと 87ms の検索が &@ で 56ms でした。

 現在、データベースのデータ量を 1/4 くらいにしているので、
前のメールと比較できる数値をご提供できません。申し訳りません。

 pg_prewarm を使えるようになったので、来週はデータ量を 1/4 に
減らさずに、全件データで検索システムを作ってみる予定です。
その時に、create index で lower を使わず、その他の測定も
再度できたらと思っています。

 適切なご指導ありがとうございました。

-----Original Message-----
From: groon****@lists*****
[mailto:groon****@lists*****] On Behalf Of Kouhei Sutou
Sent: Monday, September 11, 2017 9:13 AM
To: groon****@lists*****
Subject: [groonga-dev, 04465] Re: shared buffers hit vs read after >cat
pgrn* /dev/null

須藤です。

In <012501d3284c$3b800eb0$b2802c10$@mirror.ocn.ne.jp>
  "[groonga-dev, 04460] shared buffers hit vs read after >cat pgrn*
/dev/null" on Fri, 8 Sep 2017 11:43:20 +0900,
  <toshio_uchiy****@mirro*****> wrote:

> コマンドは
>
> explain ( analyze, buffers ) SELECT id, video, track, content,
> starttime, theme
>
> FROM manual AS P WHERE ( vc > 100000 OR sp = 1 ) and lower( content )
> like
>
> lower( '%algorithm%' ) and exists ( select video from manual AS C1
>
> where ( vc > 100000 OR sp = 1 ) and lower( content ) like lower( '%search%
'
> )
>
> and P.video = C1.video ) ORDER BY vc DESC;

これ、インデックスはどうなっていますか?

CREATE INDEX xxx ON manual
  USING PGroonga (lower(content));

みたいな感じですか?

もし、そうならこれはムダがあります。

PGroongaの場合は自分で正規化する必要はありません。PGroongaが
自動でいい感じにやっているからです。

あと、LIKEよりも&@や&@~の方が速いです。

なので、

CREATE INDEX xxx ON manual
  USING PGroonga (content);

というインデックスにして、↓とする方が速いはずです。

SELECT id, video, track, content, starttime, theme FROM manual AS P WHERE (
vc > 100000 OR sp = 1 ) and
      content &@ 'algorithm' and
      exists (
        select video from manual AS C1
               where ( vc > 100000 OR sp = 1 ) and
                     content &@ 'search' and
                     P.video = C1.video ) ORDER BY vc DESC;

というか、このexists()ってなくせないですかねぇ。

SELECT id, video, track, content, starttime, theme FROM manual WHERE ( vc >
100000 OR sp = 1 ) and
      content &@~ 'algorithm search'
ORDER BY vc DESC;

これでも同じ結果にならないかしら。

> postgresql.conf の shared_buffers 8GB
>
> shared hit 705 read 52559
>
> 実行時間16秒

PGroongaはPostgreSQLのshared_buffersを使わないので、これを指
標にするのは適切ではありません。代わりに何を指標にすればよい
かは…特になくて、指標が欲しいなら普通のOSのページキャッシュ
のヒット率とかをみればよいです。で、どうやってみるか、だれか
知っている人います?

> 一度上記の SQL コマンドを実行してから再度 SQL コマンドを実行
>
> postgresql.conf の shared_buffers 8GB
>
> shared hit 53242 (read はなし)
>
> 実行時間0.3秒

これで差がでているのは、PGroongaレベルではなくてPostgreSQLレ
ベルでのIOのキャッシュだと思うので、PostgreSQLのファイルも
cat XXX > /dev/nullしてページキャッシュに載せると速くなるん
じゃないかなぁと思いました。

PostgreSQL 9.4からはpg_prewarmという関数が追加されているみた
いなので、(PGroongaではなく)shared_buffersに関してはcatよ
りはこっちを使う方がPostgreSQLらしいと思います。

  https://www.postgresql.jp/document/9.6/html/pgprewarm.html


--
須藤 功平 <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

_______________________________________________
groonga-dev mailing list
groon****@lists*****
https://lists.osdn.me/mailman/listinfo/groonga-dev




groonga-dev メーリングリストの案内
Zurück zum Archiv-Index