Zapytanie ActiveRecord znacznie wolniejsze niż proste SQL?

Pracowałem nad optymalizacją połączeń DB w moim projekcie i zauważyłem „znaczącą” różnicę w wydajności między dwoma identycznymi połączeniami poniżej:

connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
  "SELECT SUM(my_column)
   FROM table
   WHERE id = #{id} 
   AND created_at BETWEEN '#{lower}' and '#{upper}'")

i druga wersja:

sum = Table.
      where(:id => id, :created_at => lower..upper).
      sum(:my_column)

Metoda wykorzystująca średnio pierwszą wersję trwa 300 ms (operacja nazywa się w niej kilka tysięcy razy), a metoda wykorzystująca drugą wersję zajmuje około 550 ms. To prawie 100% spadek prędkości.

Sprawdziłem dwukrotnie kod SQL wygenerowany przez drugą wersję, jest on identyczny z pierwszym z wyjątkiem dla poprzedzających go kolumn tabeli z nazwą tabeli.

Dlaczego spowolnienie? Czy konwersja między ActiveRecord i SQL naprawdę sprawia, że ​​operacja zajmuje prawie 2x?Czy muszę trzymać się pisania SQL (może nawet sproc), jeśli muszę wykonać tę samą operację wiele razy i nie chcę trafić na ten koszt?

Dzięki!

questionAnswers(1)

yourAnswerToTheQuestion