Das Senden einer Datei wird vom Betriebssystem übernommen. Der Inhalt wird einfach in den Socket eingeklemmt und erfordert keinen zusätzlichen Aufwand für Ihre Anwendung. Es ist buchstäblich Feuer und Vergessen.
Das Senden eines Datenstroms vom Datenbankserver ist erheblich komplizierter. Die Abfrage muss zusammengestellt, codiert, über den Socket gesendet, vom Server interpretiert und ausgeführt werden. Die Ergebnismenge muss erneut codiert und über das Kabel zurückgesendet werden. Vielleicht ziehen Sie diese Zeit von Ihrer Berechnung ab, aber es ist nicht klar.
Sobald der Client das Ergebnis erhalten hat, muss er es vom Socket ablesen, in Ruby-Objekte konvertieren, möglicherweise Modelle, die noch mehr Aufwand verursachen, und das Ergebnisobjekt an die anfordernde Methode zurückgeben. Wenn Sie sie dann in ein Ergebnis re-serialisieren, müssen sie diese Daten ein zweites Mal in den Ausgabestrom kopieren.
Zusammengefasst also das Lesen aus einer bereits vorhandenen Datei: Null Lesen, Null Kopien.
Lesen aus der Datenbank: Ein Lesevorgang, zwei Kopien.