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!