2017-03-14 46 views
1

我使用Rails 4.2.7.1,Ruby 2.3.1和MySQL作爲我的數據庫。我有一個後臺工作,負責收集關於執行一些非常昂貴的讀取操作的數據庫的分析。其中之一特別是行爲不一致,它似乎是由SQL查詢中IN子句的行爲不一致造成的。將數組傳遞給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>中的一個錯誤。

相關問題