pracuję na optymalizację połączeń DB mojego projektu i zauważyłem „znaczące” różnicę w wydajności pomiędzy tymi dwoma identycznymi połączeń poniżej:Zapytanie ActiveRecord jest znacznie wolniejsze niż proste zapytanie SQL?
connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
"SELECT SUM(my_column)
FROM table
WHERE id = #{id}
AND created_at BETWEEN '#{lower}' and '#{upper}'")
i drugą wersję:
sum = Table.
where(:id => id, :created_at => lower..upper).
sum(:my_column)
metoda używająca pierwszej wersji zajmuje średnio 300ms do wykonania (operacja nazywa się kilka tysięcy razy łącznie), a metoda wykorzystująca drugą wersję zajmuje około 550ms. To prawie 100% spadek prędkości.
Sprawdziłem podwójnie SQL, który został wygenerowany przez drugą wersję, jest identyczny z pierwszym z wyjątkiem dla poprzedzających 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 prostego kodu SQL (może nawet sproca), jeśli muszę wykonać tę samą operację tonę razy i nie chcę uderzyć w obciążenie?
Dzięki!
wystarczy użyć .explain i spojrzeć na zapytania, który został wygenerowany, jestem pewien, że to wygląda inaczej i to dlaczego to trwa tak znacznie dłużej – antpaw
I dwukrotnie sprawdzane planów zapytań, obie są identyczne, a koszt wszystko. Musiałam zastąpić .select z .sum w drugiej wersji, gdy otrzymasz od tego Fixnuma i nie mogę znaleźć sposobu na wykonanie .explain na kwerendzie użytej do wygenerowania. –