@kou
sample_db=# EXPLAIN ANALYZE VERBOSE SELECT COUNT(1) FROM table_2 WHERE field_1 &@ 'hoge';
QUERY PLAN
-----------------
Aggregate (cost=297.76..297.77 rows=1 width=8) (actual time=11.939..11.940 rows=1 loops=1)
Output: count(1)
-> Index Scan using pgr_table_2_field_1_index on public.table_2 (cost=0.00..297.51 rows=100 width=0) (actual time=7.459..11.564 rows=5682 loops=1)
Output: table_id, (かなり長いので省略), field_0, field_1, field_50, (かなり長いので省略)
Index Cond: (table_2.field_1 &@ 'hoge'::text)
Planning Time: 0.703 ms
Execution Time: 12.090 ms
(7 行)
このようになっています!
yyyyyy=# EXPLAIN ANALYZE VERBOSE SELECT COUNT(1) FROM table_2 WHERE field_1 &@ 'hoge';
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=379.24..379.25 rows=1 width=8) (actual time=11.730..11.731 rows=1 loops=1)
Output: count(1)
-> Bitmap Heap Scan on public.table_2 (cost=0.03..378.99 rows=100 width=0) (actual time=8.544..11.415 rows=5682 loops=1)
Recheck Cond: (table_2.field_1 &@ 'hoge'::text)
Heap Blocks: exact=1669
-> Bitmap Index Scan on pgr_table_2_field_1_index (cost=0.00..0.00 rows=151 width=0) (actual time=8.336..8.336 rows=5682 loops=1)
Index Cond: (table_2.field_1 &@ 'hoge'::text)
Planning Time: 0.661 ms
Execution Time: 11.881 ms
(9 行)
なるほどー
たしかに0.00
ですね!これを再現するデータを作れますか?作れたら https://github.com/pgroonga/pgroonga/issues でissueを作ってそこに添付して共有してください。手元でも再現させてみてみます。
ところで、当初の問題はEXISTS
を使ったシンプルなSQLにすることで解決していると思っているんですがあっていますか?(この問題の解決は急いでいないであっていますか?)
EXISTS
にする以外にも、pgroonga_table2_field2_1_index
のインデックス対象にparent_id
を入れることでも解決しそうな気はします。)
再現させたいだけでデータの中身には興味がないのでサンプルデータで大丈夫です!
準備ができたらissueにお願いします!
ちなみに。。。20318回Bitmap Index Scanが実行されること自体がボトルネックなのは間違いないと思うので、PGroongaでどうこうできる話ではないかもしれません。もしかしたら、同じSELECT
内の同じ検索条件なら検索条件をキャッシュして使いまわすとかすることはできるかもしれないので、それで2回目以降の実行時間を9ミリ秒から0ミリ秒未満にすることはできるかもしれませんが、ループ数が20318回より増えたらそれでも破綻するので、ループをなくすこと(今回だとEXISTS
を使うこと)がまっとうな対策な気はします。
Groonga開発者に聞け!(グルカイ!)第16回 9月6日(火) 12:15からYouTubeLiveで開催のおしらせ。
https://youtu.be/xCGsLvtUV8w
ご都合が合えばぜひご参加ください!
ライブチャット、Twitter、Gitterで質問も受け付けています!
connpasイベントページ
https://groonga.connpass.com/event/259369/
イベントページの申し込みはなくても大丈夫ですが、開催通知などが届くので良ければグループ登録してみてください!
Groongaが好きな方、もっと知りたい方ご視聴お待ちしています!
これまでの放送の様子はアーカイブでご覧いただけます。
https://www.youtube.com/playlist?list=PLLwHraQ4jf7PBol9aq5BoaM2Hnk6aCKs2
【イベント開催情報】
明日11/8火曜日 12:15からは第22回グルカイ!がYouTube Liveで開催されます!
https://youtu.be/CJzTL-wZ9ps
Groongaや関連プロジェクトを好きな方、もっと知りたい方、全文検索が好きな方。
ぜひお越しください!
イベントページはこちら
https://groonga.connpass.com/event/265603/
YouTubeチャンネルやConnpassのグループ登録がしてあると、グルカイ!やリリース自慢会の開催通知が届くようになりますのでよければぜひ!
グルカイ!では、みなさまからの質問もお待ちしています!
YouTube Liveのチャットでのコメントや、GroongaTwitter およびこちらのGitterで聞いていただければとりあげます!
よろしくお願いします!
【イベント開催情報】
明日11/15火曜日 12:15からは第23回グルカイ!がYouTube Liveで開催されます!
https://youtu.be/KWYKaBjOoX8
Groongaや関連プロジェクトを好きな方、もっと知りたい方、全文検索が好きな方。
ぜひお越しください!
イベントページはこちら
https://groonga.connpass.com/event/266543/
YouTubeチャンネルやConnpassのグループ登録がしてあると、グルカイ!やリリース自慢会の開催通知が届くようになりますのでよければぜひ!
グルカイ!では、みなさまからの質問もお待ちしています!
YouTube Liveのチャットでのコメントや、GroongaTwitter およびこちらのGitterで聞いていただければとりあげます!
よろしくお願いします!
【イベント開催情報】
明日11/29火曜日 12:15からはGroonga 12.1.0リリース自慢会がYouTube Liveで開催されます!
最新Groongaおよび関連プロジェクトについて開発者が自慢します!
https://youtu.be/ov33wL5HBZg
Groongaや関連プロジェクトを好きな方、もっと知りたい方、全文検索が好きな方。
ぜひお越しください!
イベントページはこちら
https://groonga.connpass.com/event/267781/
YouTubeチャンネルやConnpassのグループ登録がしてあると、グルカイ!やリリース自慢会の開催通知が届くようになりますのでよければぜひ!
みなさまからの質問もお待ちしています!
YouTube Liveのチャットでのコメントや、GroongaTwitter およびこちらのGitterで聞いていただければとりあげます!
よろしくお願いします!
# yum update groonga-httpd-12.0.8-1.el7.x86_64
(中略)
--> トランザクションの確認を実行しています。
---> パッケージ groonga.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga.x86_64 0:12.0.8-1.el7 を アップデート
---> パッケージ groonga.x86_64 0:12.1.0-1.el7 を アップデート
---> パッケージ groonga-httpd.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga-httpd.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga-httpd.x86_64 0:12.0.8-1.el7 を アップデート
---> パッケージ groonga-httpd.x86_64 0:12.1.0-1.el7 を アップデート
---> パッケージ groonga-libs.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga-libs.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga-libs.x86_64 0:12.0.8-1.el7 を アップデート
---> パッケージ groonga-libs.x86_64 0:12.1.0-1.el7 を アップデート
---> パッケージ groonga-plugin-suggest.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga-plugin-suggest.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga-plugin-suggest.x86_64 0:12.0.8-1.el7 を アップデート
---> パッケージ groonga-plugin-suggest.x86_64 0:12.1.0-1.el7 を アップデート
---> パッケージ groonga-server-common.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga-server-common.x86_64 0:12.0.3-1.el7 を 更新
---> パッケージ groonga-server-common.x86_64 0:12.0.8-1.el7 を アップデート
---> パッケージ groonga-server-common.x86_64 0:12.1.0-1.el7 を アップデート
--> 依存性解決を終了しました。
依存性を解決しました
===========================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
===========================================================================================================
更新します:
groonga x86_64 12.1.0-1.el7 groonga-centos 55 k
groonga-httpd x86_64 12.1.0-1.el7 groonga-centos 450 k
groonga-plugin-suggest x86_64 12.1.0-1.el7 groonga-centos 54 k
groonga-server-common x86_64 12.1.0-1.el7 groonga-centos 19 k
依存性関連でのインストールをします:
arrow9-libs x86_64 9.0.0-1.el7 groonga-centos 5.7 M
依存性関連での更新をします:
groonga-libs x86_64 12.1.0-1.el7 groonga-centos 2.5 M
groonga-tokenizer-mecab x86_64 12.1.0-1.el7 groonga-centos 28 k
トランザクションの要約
===========================================================================================================
インストール ( 1 個の依存関係のパッケージ)
更新 4 パッケージ (+2 個の依存関係のパッケージ)
総ダウンロード容量: 8.8 M
Is this ok [y/d/N]:
# rpm -qa | grep groonga
groonga-plugin-suggest-12.0.3-1.el7.x86_64
groonga-server-common-12.0.3-1.el7.x86_64
groonga-release-2021.10.30-1.noarch
groonga-libs-12.0.3-1.el7.x86_64
groonga-12.0.3-1.el7.x86_64
groonga-httpd-12.0.3-1.el7.x86_64
# yum update groonga-httpd-12.0.8-1.el7.x86_64
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
* epel: ftp.riken.jp
* extras: ftp.riken.jp
* updates: ftp.riken.jp
Resolving Dependencies
--> Running transaction check
---> Package groonga-httpd.x86_64 0:12.0.3-1.el7 will be updated
---> Package groonga-httpd.x86_64 0:12.0.8-1.el7 will be an update
--> Processing Dependency: groonga-server-common = 12.0.8-1.el7 for package: groonga-httpd-12.0.8-1.el7.x86_64
--> Running transaction check
---> Package groonga-server-common.x86_64 0:12.0.3-1.el7 will be updated
---> Package groonga-server-common.x86_64 0:12.0.8-1.el7 will be an update
--> Processing Dependency: groonga = 12.0.8-1.el7 for package: groonga-server-common-12.0.8-1.el7.x86_64
--> Running transaction check
---> Package groonga.x86_64 0:12.0.3-1.el7 will be updated
---> Package groonga.x86_64 0:12.0.8-1.el7 will be an update
--> Processing Dependency: groonga-libs = 12.0.8-1.el7 for package: groonga-12.0.8-1.el7.x86_64
--> Processing Dependency: groonga-plugin-suggest = 12.0.8-1.el7 for package: groonga-12.0.8-1.el7.x86_64
--> Running transaction check
---> Package groonga-libs.x86_64 0:12.0.3-1.el7 will be updated
---> Package groonga-libs.x86_64 0:12.0.8-1.el7 will be an update
--> Processing Dependency: arrow9-libs for package: groonga-libs-12.0.8-1.el7.x86_64
--> Processing Dependency: libarrow.so.900()(64bit) for package: groonga-libs-12.0.8-1.el7.x86_64
---> Package groonga-plugin-suggest.x86_64 0:12.0.3-1.el7 will be updated
---> Package groonga-plugin-suggest.x86_64 0:12.0.8-1.el7 will be an update
--> Running transaction check
---> Package arrow9-libs.x86_64 0:9.0.0-1.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
========================================================================================================================================================
Package Arch Version Repository Size
========================================================================================================================================================
Updating:
groonga-httpd x86_64 12.0.8-1.el7 groonga-centos 448 k
Installing for dependencies:
arrow9-libs x86_64 9.0.0-1.el7 groonga-centos 5.7 M
Updating for dependencies:
groonga x86_64 12.0.8-1.el7 groonga-centos 55 k
groonga-libs x86_64 12.0.8-1.el7 groonga-centos 2.5 M
groonga-plugin-suggest x86_64 12.0.8-1.el7 groonga-centos 54 k
groonga-server-common x86_64 12.0.8-1.el7 groonga-centos 18 k
Transaction Summary
========================================================================================================================================================
Install ( 1 Dependent package)
Upgrade 1 Package (+4 Dependent packages)
Total download size: 8.7 M
Is this ok [y/d/N]:
groonga-tokenizer-mecab
もインストールされていると再現しますね。
yum update groonga{,-httpd,-libs,-server-common,-plugin-suggest,-tokenizer-mecab}-12.0.8-1.el7.x86_64
と関連パッケージすべてでバージョンを指定してください。
突然の書き込み失礼いたします。初めて投稿させていただきます。
現在下記の2環境にてPGroongaの動作確認をしております。
OS以外の差異が無いよう構築を行ったのですが、それぞれの環境で動作が異なる部分があり、
原因究明のための手がかりとなる情報を頂きたい次第でございます。
以下、環境情報とインデックス、当該事象の概要となります。
■環境
・結合環境
OS: Rocky Linux release 8.4 (Green Obsidian)
PostgreSQL: 14.5
→文字コード: UTF8
PGroonga: 2.3.4-1.el8
→内部のGroonga: 11.1.0
・システム検証環境(本番相当)
OS: Red Hat Enterprise Linux release 8.6 (Ootpa)
PostgreSQL: 14.5
→文字コード: UTF8
PGroonga: 2.3.4-1.el8
→内部のGroonga: 11.1.0
■両環境で設定しているPGroongaインデックス
CREATE INDEX idx_pgroonga_text ON test.test_data
USING pgroonga (text)
WITH (plugins='token_filters/stem', tokenizer='TokenBigramSplitSymbol', token_filters='TokenFilterStem')
■事象
下記のSQLを実行したところ、結合環境とシステム検証環境で結果の差異がありました。
・実行したSQL:
select text from test.test_data where text &@~ '|agr';
・検索対象データ:
|agreement|
|AGR type reactor|
|agri-environmental policy|
・想定する結果:
検索対象データ3件が取得できること。
・実際の結果:
結合環境では3件すべて検索できたが、システム検証環境では「|AGR type reactor|」しか取得できなかった。
■試したこと
システム検証環境のトークナイザーの設定を「TokenBigramSplitSymbolAlpha」に変更したところ、
想定する結果通り3件のデータを取得することができました。
結合環境でも同じ変更を行ったところ、変わらず3件のデータを取得することができました。
■質問事項
①結合環境とシステム検証環境で検索結果が異なる原因に何かお心当たりのある方はいらっしゃいますでしょうか。
類似事象・確認すべき設定値など、手掛かりになる情報であればなんでも構いません。。
②トークナイザーを「TokenBigramSplitSymbolAlpha」に変更して想定の検索結果が取得できた理由として、
クエリ文字列「|agr」が、検索対象データのトークン「|a, ag, gr」に合致するようになったため、という理解で相違ないでしょうか?
③素人質問で大変恐縮なのですが、トークナイザーを変更した場合、お作法的に検証すべき観点等ありますでしょうか。
リファレンスを確認した限り、「TokenBigramSplitSymbolAlpha」を採用することで検索の適合率が下がり、再現率が
上がったと認識しているため、記号や空白等で区切られた文字列に対して検索を行い、想定の結果が得られるかのテストを行おうと考えております。
以上になります。長文失礼いたしました。
いずれか一つでも構いませんので、何らかのご回答を頂けますと大変助かります。
EXPLAIN ANALYZE VERBOSE
した結果をもらえますか?あと、複数のご質問をいただいているので https://github.com/pgroonga/pgroonga/discussions のほうがやり取りしやすいと思います。お手数ですが https://github.com/pgroonga/pgroonga/discussions に同じ内容を転記いただいて、そちらでやり取りするのはどうでしょうか?
お世話になります。Mroongaのテーブル更新に関わる挙動について
ご教授いただければと思います。以下の環境で利用しています。
RedHat Enterprise Linux 8.6
Mroonga 12.10
MySQL 8.0.31-1
事象とすると、ストレージエンジンにMroongaを指定したテーブルに
複合主キーを設定していると、レコードの更新に失敗してしまいます。
具体的には、以下のようなテーブルがあったとします。
CREATE TABLE tbl_work (
cid char(10) NOT NULL,
fid char(10) NOT NULL,
title varchar(200) NOT NULL,
content longtext,
PRIMARY KEY (cid, fid),
FULLTEXT INDEX search_fidx (title, content) COMMENT 'normalizer "NormalizerAuto"'
) ENGINE = Mroonga DEFAULT CHARSET utf8;
上記テーブルに対してレコードの更新を行うと、以下の通りエラーとなってしまいます。
mysql> INSERT INTO tbl_work (cid, fid, title) VALUES ('C000001234', '0000001011', 'テスト登録');
Query OK, 1 row affected (0.00 sec)
mysql> UPDATE tbl_work SET content='test' WHERE cid='C000001234' AND fid='0000001011';
ERROR 1265 (01000): data truncated for primary key column: <cid>
mysql>
テーブル作成時に全文検索のインデックス指定を除外しても状況変わらず、
ストレージエンジンにMyISAMを指定した同一構造のテーブルでは問題ありません。
基本的な事であったら申し訳ないのですが、本事象について情報などありますでしょうか。