【发布时间】:2012-06-20 05:48:21
【问题描述】:
我一直致力于优化我项目的数据库调用,我注意到以下两个相同调用之间的性能存在“显着”差异:
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(甚至可能是存储过程)?
谢谢!
【问题讨论】:
-
只需使用 .explain 并查看生成的查询,我确信它看起来不同,这就是为什么它需要更长的时间
-
我仔细检查了查询计划,它们都是相同的,成本和所有。在第二个版本中,必须从 .sum 中替换 .select,因为您从那个版本中得到了一个 Fixnum,而我找不到对用于生成它的查询进行 .explain 的方法。
标签: ruby-on-rails ruby-on-rails-3 postgresql database-performance