Ruby on Rails: Modell.alle.jede vs find_by_sql("SELECT * FROM model").jeder?
Ich bin Recht neu auf RoR. In mein controller, ich bin der Iteration über alle Tupel in der Datenbank. Für jede Tabelle, für jede Spalte, die ich verwendet, um zu rufen
SomeOtherModel.find_by_sql("SELECT column FROM model").each {|x| #etc }
das funktionierte gut genug. Wenn ich später änderte sich dies zu
Model.all(:select => "column").each {|x| #etc }
die Schleife beginnt bei etwa der gleichen Geschwindigkeit, aber bremst etwas wie 100-mal langsamer als die der find_by_sql Befehl. Diese Anrufe sollten identisch sein, damit ich wirklich don T wissen, was passiert.
Ich kenne diese Anrufe sind nicht die effizienteste, aber das ist nur ein Zwischenschritt, und ich werde es optimieren mehr, sobald dieser korrekt funktioniert.
Also zu klären: Warum in der Welt nicht aufrufen Modell.alle.jedes laufen, so viel langsamer als mit find_by_sql.jeder?
Dank!
InformationsquelleAutor B_. | 2010-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide Anrufe machen die gleichen SQL-Aufruf, so dass Sie beide sollten ungefähr die gleiche Geschwindigkeit.
Model.all
geht, durch eine zusätzliche Ebene der Dereferenzierung. Ich denke, dass die Schienen inall
sammelt alle Zeilen aus der DB-Verbindung und ruft dann, dass die collection als Parameter an eine andere Methode, die Schleifen über die Sammlung und schafft die model-Objekte. Infind_by_sql
es macht das ganze in 1 Methode. Vielleicht ist das ein wenig schneller. Wie groß ist der Datensatz? Wenn der gesetzt ist über 100 oder so Aufzeichnungen sollten Sie nicht verwenden, sondern verwendenfind_in_batches
. Es setzt Grenzen und offsets, die zum ausführen des Codes in batches und nicht laden Sie die ganze Tabelle auf einmal in den Speicher. Sie müssen den primär-Schlüssel in der select-da nutzt es diese, um die Bestellung zu tun und zu begrenzen. Beispiel:all
ist ein alias fürfind(:all)
die schließlich ruftfind_by_sql
genau das ist der Grund, warum ich verstehe nicht die Verlangsamung. Wie ich schon sagte, ich weiß, dies ist nicht die effizienteste nennen, aber wenn dies nicht funktioniert, dann effizienter zu telefonieren wird nicht funktionieren. Ich kann nicht rufenfind_in_batches
(oder, besser gesagt,find_each
), weil die Struktur meiner Datenbank, aber das ist neben dem Punkt. Vielen Dank für die Beantwortung, obwohl.InformationsquelleAutor scottd
ScottD korrekt ist. Die find_by_sql rufen Sie nicht die Verlangsamung, die Sie sehen, B_. Die speed-Probleme sind aufgrund der Tatsache, dass Modell.alle Lasten, die ein-Modell-Instanz in den Speicher für jeden einzelnen Datensatz geholt. Dadurch kann es zum vollständigen Ausfall mit einem ausreichend großen Ergebnismenge. FYI, dies ist abgedeckt sehr gut in die Rails Guides hier: http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects
InformationsquelleAutor bramswenson