Un par de cosas saltan a la vista.
En primer lugar, si este código se llama 2000 veces y tarda 250 ms adicionales en ejecutarse, eso es ~ 0,125 ms por llamada para convertir el Arel a SQL, lo cual no es poco realista.
En segundo lugar, no estoy seguro de los aspectos internos de Range en Ruby, pero lower..upper
puede estar haciendo cálculos como el tamaño del rango y otras cosas, lo que será un gran impacto en el rendimiento.
¿Ves el mismo impacto en el rendimiento con lo siguiente?
sum = Table.
where(:id => id).
where(:created_at => "BETWEEN ? and ?", lower, upper).
sum(:my_column)