He estado trabajando en la optimización de las llamadas de base de datos de mi proyecto y me di cuenta de una diferencia "significativa" en el rendimiento entre las dos llamadas idénticas a continuación:Consulta ActiveRecord mucho más lenta que SQL recta?
connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
"SELECT SUM(my_column)
FROM table
WHERE id = #{id}
AND created_at BETWEEN '#{lower}' and '#{upper}'")
y la segunda versión:
sum = Table.
where(:id => id, :created_at => lower..upper).
sum(:my_column)
El el método que utiliza la primera versión, en promedio, tarda 300 ms en ejecutarse (la operación se llama un par de miles de veces en total), y el método que utiliza la segunda versión lleva unos 550 ms. Eso es casi un 100% de disminución en la velocidad.
Comprobé dos veces el SQL generado por la segunda versión, es idéntico al primero con excepción de anteponer las columnas de la tabla con el nombre de la tabla.
- ¿Por qué la ralentización? ¿La conversión entre ActiveRecord y SQL realmente hace que la operación tome casi 2 veces?
- ¿Debo seguir escribiendo SQL directamente (tal vez incluso un sproc) si necesito realizar la misma operación una tonelada de veces y no quiero tocar la cabeza?
Gracias!
sólo tiene que utilizar • Explicar y mirar a la consulta que se generó, estoy seguro de que tiene un aspecto diferente y es por eso que se necesita mucho más tiempo – antpaw
Verifiqué los planes de consulta, los dos son idénticos, el costo y todas. Tuve que sustituir .select de .sum en la segunda versión, ya que obtiene un Fixnum de ese y no puedo encontrar una forma de hacer un .explain en la consulta que se utilizó para generarlo. –