私は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の範囲にあることに注意してください。
'MyModel.joins(:other_model).some_scope.count'のようなものを試して、それが動作するかどうかを確認してください。 'IN'ステートメントは本当に重く、2000以上の可能な値を含んでいる場合はさらに多くなります。更新:私はそのグループを見なかった。 'MyModel.joins(:other_model).some_scope.group(:my_model_id).count'などのクエリに追加することもできます。 – fanta
ええ、私が質問したように、結合の方法は一貫しています。回避策はうまくいきますが、INアプローチが矛盾している理由を理解したいと考えています。遅く私は理解する(そして期待する)が、不一致が私を驚かせる。 – agarcher