ActiveRecord-Abfrage viel langsamer als direktes SQL?

Ich habe an der Optimierung der DB-Aufrufe meines Projekts gearbeitet und einen "signifikanten" Leistungsunterschied zwischen den beiden folgenden identischen Aufrufen festgestellt:

connection = ActiveRecord::Base.connection()
pgresult = connection.execute(
  "SELECT SUM(my_column)
   FROM table
   WHERE id = #{id} 
   AND created_at BETWEEN '#{lower}' and '#{upper}'")

und die zweite Version:

sum = Table.
      where(:id => id, :created_at => lower..upper).
      sum(:my_column)

Die Ausführung der Methode mit der ersten Version dauert im Durchschnitt 300 ms (die Operation wird insgesamt ein paar tausend Mal aufgerufen), und die Methode mit der zweiten Version dauert etwa 550 ms. Das ist eine fast 100% ige Abnahme der Geschwindigkeit.

Ich habe das SQL, das von der zweiten Version generiert wurde, doppelt überprüft. Es ist identisch mit dem ersten, mit der Ausnahme, dass Tabellenspalten mit dem Tabellennamen vorangestellt werden.

Warum die Verlangsamung? Dauert die Konvertierung zwischen ActiveRecord und SQL tatsächlich fast zweimal?Muss ich mich daran halten, reines SQL zu schreiben (vielleicht sogar einen Sproc), wenn ich den gleichen Vorgang tonnenweise ausführen muss und den Overhead nicht beeinträchtigen möchte?

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage