私は私のプロジェクトのDB呼び出しの最適化に取り組んできたと私は下の2回の同一の呼び出しの間の性能における「重要」の違いに気づい: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)
メソッドは、平均で最初のバージョンを使用して実行するのに300msかかる(その中で合計数千回と呼ばれます)、第2バージョンを使用するメソッドは約550msかかります。それは速度がほぼ100%低下します。
2番目のバージョンで生成されたSQLを再確認しました。最初のテーブルと同じですが、テーブル名の前にテーブルの列が追加されています。
- なぜスローダウンですか? ActiveRecordとSQLの間の変換は実際に操作をほぼ2倍にするのですか?
- 同じ操作を何度も実行する必要があり、オーバーヘッドにぶつかりたくない場合は、まっすぐなSQL(おそらくはsproc)を書くことに固執する必要がありますか?
ありがとう!
だけ.explain使用して生成されたクエリを見て、私はそれが違って見える、それはそんなに長く – antpaw
私は、クエリ・プランダブルチェックを取る理由thatsの、彼らは両方とも同じであると確信している、コストとすべて。 2番目のバージョンで.sumを.selectに置き換えなければならなかったのですが、Fixnumを元に戻すと、生成するために使用されたクエリに対して.explainを実行する方法が見つけられません。 –