プロジェクトのDB呼び出しの最適化に取り組んでいますが、以下の2つの同一の呼び出しのパフォーマンスに「大幅な」違いがあることに気付きました。
connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
"SELECT SUM(my_column)
FROM table
WHERE id = #{id}
AND created_at BETWEEN '#{lower}' and '#{upper}'")
および2番目のバージョン:
sum = Table.
where(:id => id, :created_at => lower..upper).
sum(:my_column)
最初のバージョンを使用する方法は、実行に平均300msかかり(操作はその中で合計で数千回呼び出されます)、2番目のバージョンを使用する方法は約550msかかります。これは、速度がほぼ100%低下します。
2番目のバージョンで生成されたSQLを再確認しました。これは、テーブルの列の前にテーブル名を付けることを除いて、最初のバージョンと同じです。
- なぜ減速するのですか?ActiveRecordとSQLの間の変換により、実際に操作にほぼ2倍の時間がかかりますか?
- 同じ操作を何度も実行する必要があり、オーバーヘッドにぶつかりたくない場合は、ストレートSQL(おそらくsprocでさえ)を書くことに固執する必要がありますか?
ありがとう!