堀本です。 原因と対処方法がわかったので、報告いたします。 原因はMroongaのバグでした。 以下の提示いただいたクエリーを実行した際 MariaDBのオプティマイザーは、IN句内のサブクエリーを実行した結果のテーブルと IN句の外側のテーブル(Posts)テーブルをSEMI JOINで結合します。 SELECT Id, ChannelId, RootId FROM Posts p3 WHERE Id IN ( SELECT * FROM (SELECT RootId FROM Posts WHERE UpdateAt > 1617352409099 AND ChannelId = 'i9rsh6im4ffepfpdgm51hjze3a' LIMIT 1000) temp_tab); IN句の中のサブクエリーの結果は以下のようになり、 以下の表の値と、Posts.Idの値が同じレコードを抽出します。 つまり、''(空文字)と"twn3smcaei8wjbqsm8bcmo8qah"と一致する Posts.Idを持つレコードを抽出します。 +----------------------------+ | RootId | +----------------------------+ | | | | | | | | | | | | | twn3smcaei8wjbqsm8bcmo8qah | | | | | | | | | | | | | | | | | | | | | | | | | | | +----------------------------+ 20 rows in set (0.001 sec) この時、Mroongaを使用していると、''と一致するレコードとして 任意のIDを持つレコードを抽出してしまい、意図しないIDのレコードが結果に含まれてしまいます。 InnoDBでは、再現しないため、Mroonga特有の問題です。 Mroongaを修正しますが、さしあたっては以下の対処方法で 正しい結果が得られます。 今回の問題は、''のような空文字のレコードを持つ表との結合 で発生します。したがって、''のようなレコードが含まれないように することで現象の発生を防げます。 RootIdはIdと比較しており、IdはNOT NULL属性なので、RootIdが''なレコード は除外しても問題ないと考えます。 そのため、問題のクエリーのIN句の中のサブクエリーに 以下のように、RootId <> ''を追加してRootIdが''なレコードを除外します。 このようにすることで、期待する結果が得られます。 SELECT Id, ChannelId, RootId FROM Posts p3 WHERE Id IN ( SELECT * FROM (SELECT RootId FROM Posts WHERE UpdateAt > 1617352409099 AND ChannelId = 'i9rsh6im4ffepfpdgm51hjze3a' AND RootId <> '' LIMIT 1000) temp_tab); Mroongaの修正が完了しましたら、また改めて連絡します。 以上です。失礼いたします。 From: 渡部克仁 <watan****@ksw*****> Subject: [groonga-dev,04875] Mroongaバグ報告(6) Date: Mon, 5 Jul 2021 13:13:26 +0900 > 【秘密】関係者外秘 > To:堀本様 > > 渡部@国際ソフトウェアと申します。 > > 状況をお知らせいただきありがとうございます。 > 再現でき調査中とのこと、承知いたしました。 > > 申し訳ありませんが、引き続きよろしくお願いいたします。 > > > On 2021/07/05 12:00, groon****@lists***** wrote: >> groonga-dev >> メーリングリストへの投稿は以下のアドレスに送ってください. >> groon****@lists***** >> Webブラウザを使って入退会するには以下のURLにどうぞ. >> https://lists.osdn.me/mailman/listinfo/groonga-dev >> メールを使う場合,件名(Subject:)または本文に help >> と書いて以下の アドレスに送信してください. >> groon****@lists***** >> メーリングリストの管理者への連絡は,以下のアドレスにお願いします. >> groon****@lists***** >> 返信する場合,件名を書き直して内容がわかるようにしてください. >> そのままだと,以下のようになってしまいます. >> "Re: groonga-dev まとめ読み, XX 巻 XX 号" >> 本日の話題: >> 1. [groonga-dev,04874] Re: Mroongaバグ報告(5) (Horimoto Yasuhiro) >> ---------------------------------------------------------------------- >> Message: 1 >> Date: Mon, 05 Jul 2021 10:44:44 +0900 (JST) >> From: Horimoto Yasuhiro <horim****@clear*****> >> To: groon****@lists***** >> Subject: [groonga-dev,04874] Re: Mroongaバグ報告(5) >> Message-ID: >> <20210****@clear*****> >> Content-Type: Text/Plain; charset=utf-8 >> 堀本と申します。 >> こちらですが、頂いたデータで再現できました。ありがとうございます。 >> 現在、原因を調査中ですので、もう少々お待ちください。 >> 以上です。失礼いたします。 >> From: 渡部克仁 <watan****@ksw*****> >> Subject: [groonga-dev,04873] Mroongaバグ報告(5) >> Date: Fri, 2 Jul 2021 13:27:17 +0900 >> >>> 【秘密】関係者外秘 >>> To:須藤様 >>> >>> 渡部@国際ソフトウェアと申します。 >>> >>> 6/18(金)に下記データを提出させていただきましたが、 >>> その後の状況はいかがでしょうか。 >>> 進展の有無に関わらずお知らせいただければ幸いです。 >>> >>> ご多忙中の所、恐れ入りますがよろしくお願いいたします。 >>> >>> >>> On 2021/06/18 10:48, 渡部克仁 wrote: >>>> 【秘密】関係者外秘 >>>> To:須藤様 >>>> 渡部@国際ソフトウェアと申します。 >>>> ご返信ありがとうございます。 >>>> ご質問の件、以下にご回答いたします。 >>>>> ↓で再現するということなのでId, ChannelId, RootId, UpdateAt, >>>>> ChannelIdのカラムだけあると再現データを作れそうなのですが、 >>>>> そのデータだけ提供してもらうことはできますか? >>>>> >>>>> SELECT Id, ChannelId, RootId >>>>> FROM Posts p3 >>>>> WHERE Id IN ( >>>>> SELECT * FROM >>>>> (SELECT RootId >>>>> FROM Posts >>>>> WHERE UpdateAt > 1617352409099 AND >>>>> ChannelId = 'i9rsh6im4ffepfpdgm51hjze3a' >>>>> LIMIT 1000) >>>>> temp_tab); >>>>> >>>> 以下のクエリーの実行結果を送付いたします。 >>>> SELECT Id, ChannelId, RootId, UpdateAt FROM Posts; >>>> 以上、よろしくお願いいたします。 >>> >>> _______________________________________________ >>> groonga-dev mailing list >>> groon****@lists***** >>> https://lists.osdn.me/mailman/listinfo/groonga-dev >> ------------------------------ >> Subject: まとめ読みフッタ >> _______________________________________________ >> groonga-dev mailing list >> groon****@lists***** >> https://lists.osdn.me/mailman/listinfo/groonga-dev >> ------------------------------ >> 以上: groonga-dev まとめ読み, 149 巻, 2 号 >> *************************************************** >> > > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > https://lists.osdn.me/mailman/listinfo/groonga-dev