Zend_Db: fetchAll() oder query()/fetch() für eine große Anzahl von Datensätzen
Vorausgesetzt, ich habe
$db is an instance of Zend_Db_Adapter_Abstract and
$sql = 'SELECT blah blah FROM table' will return a huge number of records.
Gibt es zwei code-Fragmente zur Verarbeitung der zurückgegebenen Daten wie folgt.
//Code fragment 1 (let's call it C1).
$results = $db->fetchAll($sql);
foreach ($results as $row) {
//Process $row
}
//Code fragment 2 (let's call it C2).
$stmt = $db->query($sql);
while ($row = $stmt->fetch()) {
//Process $row
}
Mein Verständnis ist, dass C1 lädt alle zurückgegebenen Daten an die $Ergebnisse. Also, eine große Daten geladen, um PHP-Speicher. Hier sind meine Fragen.
- Tut C2-laden Sie alle Daten an PHP-Speicher oder verarbeitet Sie nacheinander wie vorbereiten/ausführen?
- Vorausgesetzt, es gibt keine andere option, ist C1 oder C2 die bessere Wahl?
Dank!
InformationsquelleAutor der Frage peidiam | 2012-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Vermutung richtig ist. Zumindest, wenn Sie den PDO-Treiber, ->fetch() liest die Ergebnisse Ungepuffert, während ->fetchAll() gibt alle Daten in ein großes array.
Bewusst sein, dass, wenn Sie mit ->fetch ()), müssen Sie vorsichtig sein, über das, was Sie zu tun versuchen, innerhalb deiner Schleife. Sie können nicht führen Sie zusätzliche Abfragen auf derselben Verbindung, während Sie habe noch eine Ungepuffert ResultSet.
So, wenn Ihr plan ist es, um diese zu aktualisieren, dieselben Zeilen innerhalb der Schleife müssen Sie einen Weg finden, um die Verzögerung der Ausführung des updates (von queuing dann irgendwie), bis Sie haben, beendet die Schleife.
InformationsquelleAutor der Antwort timdev
Im obigen Beispiel
$stmt = $db->query($sql);
abgerufen dieresultset
im Speicher undfetch
wird verwendet zum abrufen der aktuellen Zeile in der Schleife von derresultset
bewegt den cursor zur nächsten Zeile, bis Sie die Letzte Zeile in derresultset
.Alternativ können Sie
Referenz: Zend_Db_Table..
Für mehr: Abrufen einer Zeile..
Ich denke
fetchAll()
ist schneller, denn es werden alle Daten in einem Schritt und gibt ein array zurück, aber verbraucht mehr Speicher, aberfetch()
verbraucht weniger Speicher, aber die Daten abruft.Referenz: Hier.
InformationsquelleAutor der Antwort The Alpha