2017-03-14 11 views
1

私はRails 4.2.7.1、Ruby 2.3.1およびMySQLをデータベースとして使用しています。私は非常に高価な読み取り操作を実行するデータベースに関する分析を収集するバックグラウンドジョブを持っています。そのうちの1つは特に不整合な動作をしており、SQLクエリのIN句の動作が矛盾しているように見えます。ArrayをActiveRecordに渡すときに一貫性のない結果#

MyModel.some_scope.where(id: OtherModel.where(<CONDITION>).group(:my_model_id).select(:my_model_id)).count 

結果のSQLクエリでIN句に沸く:

レールの呼び出しは次のようになり。これは一般的にうまくいきますが、ネストされたクエリ(OtherModel...)が大きくなると(〜2000件の結果)、私はINから矛盾した結果が出始めます。クエリを何度も何度も実行すると、データベースの実際の変更とは独立してドリフトアップとダウンドリフトが表示されます。

私は再作成する場合は、使用する上記のクエリはそうのように、加入:

MyModel.some_scope.joins(:other_model).where(<CONDITION>).select(:id).uniq.count 

私はクエリから毎回一貫した結果を参照してください。私はこのケースではクエリを書き直しても何の問題もなく、したがって、私の問題に対する解決策がありますが、MySQLで何が起きているかを理解したいと思います。

作業中のクエリ(結合付き)が〜1300個のレコードを返し、壊れたクエリが〜1400-1600の範囲にあることに注意してください。

+0

'MyModel.joins(:other_model).some_scope.count'のようなものを試して、それが動作するかどうかを確認してください。 'IN'ステートメントは本当に重く、2000以上の可能な値を含んでいる場合はさらに多くなります。更新:私はそのグループを見なかった。 'MyModel.joins(:other_model).some_scope.group(:my_model_id).count'などのクエリに追加することもできます。 – fanta

+0

ええ、私が質問したように、結合の方法は一貫しています。回避策はうまくいきますが、INアプローチが矛盾している理由を理解したいと考えています。遅く私は理解する(そして期待する)が、不一致が私を驚かせる。 – agarcher

答えて

0

誤警報。結合はサブクエリとまったく同じように動作します。参加方法をテストしたとき、私は安定した時期にヒットしました。私は、いずれのアプローチでも不一致を再現できるようになりました。

データが正当な速さで十分に変化しているため、結果が大きく変動することがわかります。これは<CONDITION>のバグに由来します。

関連する問題