我一直在努力優化我的項目的數據庫調用,我注意到在性能下面的兩個相同的呼叫之間「顯著」的區別:ActiveRecord的查詢比直接SQL慢多少?
connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
"SELECT SUM(my_column)
FROM table
WHERE id = #{id}
AND created_at BETWEEN '#{lower}' and '#{upper}'")
和第二個版本:
sum = Table.
where(:id => id, :created_at => lower..upper).
sum(:my_column)
的平均使用第一個版本的方法需要300毫秒才能執行(該操作在其中被稱爲總共幾千倍),而使用第二版本的方法需要大約550毫秒。速度幾乎降低了100%。
我仔細檢查了由第二個版本生成的SQL,它與第一個相同,除了預先在表名列中添加表列之外。
- 爲什麼減速? ActiveRecord和SQL之間的轉換是否真的使得這個操作接近2倍?
- 如果我需要多次執行相同的操作並且我不想打開開銷,我是否需要堅持直寫SQL(甚至可能是sproc)?
謝謝!
只是使用.explain看看生成的查詢,我敢肯定,它看起來不同,這就是爲什麼需要這麼長很多 – antpaw
我雙重檢查查詢計劃,它們都是相同的,成本和所有。必須從第二個版本的.sum中替代.select,因爲您從該版本中獲得了Fixnum,並且我無法找到在用於生成它的查詢上執行.explain的方法。 –