Kilka rzeczy wyskakuje.
Po pierwsze, jeśli ten kod jest wywoływany 2000 razy, a jego uruchomienie zajmuje dodatkowe 250 ms, to jest to ~0,125 ms na wywołanie, aby przekonwertować Arel na SQL, co nie jest nierealne.
Po drugie, nie jestem pewien wewnętrznych elementów Range w Ruby, ale lower..upper
może wykonywać obliczenia, takie jak rozmiar zasięgu i inne rzeczy, które będą dużym hitem wydajności.
Czy widzisz ten sam spadek wydajności z następującymi?
sum = Table.
where(:id => id).
where(:created_at => "BETWEEN ? and ?", lower, upper).
sum(:my_column)