【问题标题】:Inconsistent results when passing array to ActiveRecord#where将数组传递给 ActiveRecord#where 时结果不一致
【发布时间】:2017-03-14 16:57:22
【问题描述】:

我使用 Rails 4.2.7.1、Ruby 2.3.1 和 MySQL 作为我的数据库。我有一个后台工作,负责收集有关执行一些非常昂贵的读取操作的数据库的分析。其中一个特别是行为不一致,这似乎是由 SQL 查询中 IN 子句的行为不一致引起的。

rails 调用看起来像这样:

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,或类似的东西。
  • 是的,正如我在问题中所说,连接方法是一致的。解决方法工作正常,但我希望了解为什么 IN 方法不一致。慢我会理解(并期待),但不一致让我感到惊讶。

标签: mysql ruby-on-rails rails-activerecord


【解决方案1】:

误报。连接的行为与子查询完全相同。当我测试加入方法时,我碰巧遇到了一个稳定期。我现在可以用任何一种方法重现不一致的地方。

问题在于数据的合理变化速度足够快,以至于我看到结果波动很大。它源于&lt;CONDITION&gt; 中的一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多