10 Stimmen

Zend_Db: fetchAll() oder query()/fetch() für eine große Anzahl von Datensätzen

Angenommen, ich habe

$db ist eine Instanz von Zend_Db_Adapter_Abstract und
$sql = 'SELECT blah blah FROM table' wird eine große Anzahl von Datensätzen zurückgeben.

Es gibt zwei Codefragmente zur Verarbeitung der zurückgegebenen Daten wie folgt.

// Codefragment 1 (nennen wir es C1).
$results = $db->fetchAll($sql);
foreach ($results as $row) {
    // Prozessiere $row
}

// Codefragment 2 (nennen wir es C2).
$stmt = $db->query($sql);
while ($row = $stmt->fetch()) {
    // Prozessiere $row
}

Mein Verständnis ist, dass C1 alle zurückgegebenen Daten in $results lädt. So wird eine große Menge an Daten im PHP-Speicher geladen. Hier sind meine Fragen.

  1. Lädt C2 alle Daten in den PHP-Speicher oder verarbeitet es diese wie prepare/execute?
  2. Angenommen es gibt keine andere Option, ist C1 oder C2 die bessere Option?

Danke!

17voto

timdev Punkte 59971

Ihre Vermutung ist korrekt. Zumindest, wenn Sie den PDO-Treiber verwenden, liest ->fetch() die Ergebnisse ohne Pufferung, während ->fetchAll() alle Daten in einem großen Array zurückgibt.

Seien Sie sich bewusst, dass Sie, wenn Sie ->fetch() verwenden, vorsichtig sein müssen, was Sie innerhalb Ihrer Schleife versuchen zu tun. Sie können keine zusätzlichen Abfragen auf derselben Verbindung ausführen, solange Sie noch ein nicht gepuffertes Ergebnis haben.

Also, wenn Ihr Plan ist, dieselben Zeilen innerhalb der Schleife zu aktualisieren, müssen Sie einen Weg finden, die Updates zu verzögern (indem Sie sie irgendwie in die Warteschlange stellen), bis Sie die Schleife verlassen haben.

10voto

The Alpha Punkte 137600

Um eine Zeile aus dem Ergebnisdatensatz abzurufen, verwenden Sie die fetch()-Methode des Statement-Objekts. Referenz

$sql = 'SELECT blah blah FROM table';
$stmt = $db->query($sql);
while ($row = $stmt->fetch()) {
    // Verarbeiten von $row
}

In obigem Beispiel hat $stmt = $db->query($sql); den Ergebnisdatensatz im Speicher abgerufen und fetch wird verwendet, um die aktuelle Zeile in der Schleife aus dem Ergebnisdatensatz abzurufen, was den Cursor zur nächsten Zeile verschiebt, bis die letzte Zeile im Ergebnisdatensatz erreicht ist.

Um alle Zeilen des Ergebnisdatensatzes in einem Schritt abzurufen, verwenden Sie die fetchAll()-Methode. Dies entspricht dem Aufruf der fetch()-Methode in einer Schleife und gibt alle Zeilen in einem Array zurück.

$sql = 'SELECT blah blah FROM table';
$stmt = $db->query($sql);
$rows = $stmt->fetchAll();
echo $rows[0]['col1']; // Das erste Feld aus der ersten Zeile

Alternativ können Sie verwenden

....
$table = new Mytable();
// Suchen einer einzelnen Zeile Gibt einen Rowset zurück
$rows = $table->find(1234);

// Suchen mehrerer Zeilen Gibt ebenfalls einen Rowset zurück
$rows = $table->find(array(1234, 5678));

Referenz: Zend_Db_Table..

Für mehr: Abrufen einer Zeile..

Ich denke, dass fetchAll() schneller ist, weil es alle Daten in einem Schritt abruft und ein Array zurückgibt, aber mehr Speicher verbraucht, während fetch() weniger Speicher verbraucht, aber die Daten einzeln abruft.

Die API für Abrufvorgänge wurde überarbeitet, um einem Zend_Db_Table_Select-Objekt zu ermöglichen, die Abfrage zu modifizieren. Die veraltete Verwendung der fetchRow()- und fetchAll()-Methoden wird jedoch weiterhin ohne Änderungen funktionieren.

Mehr Referenz: Hier.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X