我有三個模型,看起來像這樣:可憐的Ruby on Rails的性能:包括
class Bucket < ActiveRecord::Base
has_many :entries
end
class Entry < ActiveRecord::Base
belongs_to :submission
belongs_to :bucket
end
class Submission < ActiveRecord::Base
has_many :entries
belongs_to :user
end
class User < ActiveRecord::Base
has_many :submissions
end
當我找回做這樣的事情項的集合:
@entries = Entry.find(:all,
:conditions => ['entries.bucket_id = ?', @bucket],
:include => :submission)
性能雖然我得到大量額外的查詢,但因爲視圖使用了Submission.user對象,所以它非常快速。但是,如果將用戶添加到:include語句,則性能變得非常糟糕,並且需要一分鐘才能返回總共50個條目並將其分發給5個用戶。當我運行關聯的SQL命令時,它們在一秒鐘內完成 - SQL查詢性能與每組查詢相同。
@entries = Entry.find(:all,
:conditions => ['entries.bucket_id = ?', @bucket],
:include => {:submission => :user})
爲什麼第二個命令與第一個命令相比會有如此糟糕的表現?
只是爲了澄清:您直接執行查詢,因爲它們出現在您的development.log中? – 2010-03-18 02:56:34
是的,我完全按照它們出現在開發日誌中那樣添加了查詢。看起來這可能是一個對象序列化/反序列化問題,因爲視圖需要28秒才能在用戶包含的情況下運行。 – 2010-03-18 17:43:16