我使用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範圍內。
嘗試像'MyModel.joins(:other_model).some_scope.count',看看是否有效。 「IN」語句非常重要,如果包含超過2000個可能的值,則會更多。更新:我沒有看到那個組。你也可以將它添加到查詢'MyModel.joins(:other_model).some_scope.group(:my_model_id).count',或類似的東西。 – fanta
是的,正如我在問題中所說的那樣,連接方式是一致的。解決方法工作正常,但我希望能夠理解爲什麼IN方法不一致。慢,我會理解(並期望),但不一致性讓我感到驚訝。 – agarcher