我剛剛從Rails 4.0.2更新到Rails 4.1.2,並意識到ActiveRecord包含的內容變得非常慢。以前只需幾毫秒就可以拍攝近5分鐘。ActiveRecord包含過度連接表在Rails 4.1.2中速度很慢
我在模型中用has_and_belongs_to_many在一個連接表上連接兩個表項和關鍵字。我有近3000個項目,3000個關鍵字和8000個連接表條目。
獲取的所有項目,幷包括曾經是非常快的,但現在,所有關鍵字需要永遠:
Item.includes(:keywords)
我比較這兩個4.0.2和4.1.2和Rails似乎不使用內部連接的SQL在Rails 4.1.2中再次查詢。數據庫響應時間非常快,所以這不是問題。
SQL爲Rails 4.0.2
項目負載(5.8ms)選擇
items
。* FROMitems
SQL(4.6ms)選擇
keywords
。*,t0
。item_id
AS ar_association_key_name FROMkeywords
INNER JOINitems_keywords
t0
ONkeywords
。id
=t0
。keyword_id
WHEREt0
。item_id
IN (<ID1> ...)
SQL爲Rails 4.1.2
項目負載(3.7ms)選擇
items
。* FROMitems
HABTM_Keywords負載(2.8ms)SELECT
items_keywords
。* FROMitems_keywords
WHEREitems_keywords
。item_id
IN(<ID1> ...)關鍵字負荷(0.6ms)選擇
keywords
。* FROMkeywords
WHEREkeywords
。id
IN(<ID1> ...)
這是一個已知的問題?我找不到任何關於此的內容,因此我認爲在報告錯誤報告之前最好先問社區。
現在我改變了我的Rails版本回到4.0.2。
謝謝Björn
如果你可以做一個準系統的簡單案例展示這種行爲,那麼我會建議用這個例子提交一份報告。 – pdobb
什麼是爲每個版本的Rails生成的SQL?使用'Item.includes(:keywords).to_sql'來找出。 – infused
我編輯問題幷包含生成的SQL。它已經在4.1.2中改變了,不再使用內部連接,現在執行了三個單獨的查詢。 – dasboe