我一直在优化我的项目的数据库调用,我注意到以下两个相同调用之间的性能存在“显着”差异:
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)
使用第一个版本的方法平均执行时间为 300ms(该操作在其中总共调用了几千次),使用第二个版本的方法大约需要 550ms。这几乎是 100% 的速度下降。
我仔细检查了第二个版本生成的 SQL,它与第一个版本相同,但它在表列前加上表名。
- 为什么会减速?ActiveRecord 和 SQL 之间的转换真的使操作花费了将近 2 倍吗?
- 如果我需要执行相同的操作很多次并且我不想遇到开销,我是否需要坚持编写直接的 SQL(甚至可能是一个 sproc)?
谢谢!