2012-11-26 11 views
9

Sollten PDO-vorbereitete Anweisungen nach der Verwendung freigegeben werden? Und wenn ja, wie? Insbesondere frage ich nach MySQL - wie können Sie und sollten Sie DEALLOCATE PREPARE obwohl PDO anrufen. (Edit: Um dies zu verdeutlichen, bezieht sich diese Frage nicht auf emulierte Prepares, sondern real vorbereitet.)Freigeben von PDO vorbereiteten Anweisungen (DEALLOCATE PREPARE)

Auch - wird dies die Ergebnisse freisetzen (wenn groß)?

Erläuterung:

Ich habe nach dem Vorbild der

$stmnt = $db->prepare($sql); 
$stmnt->execute($aParams); 
$stmnt = null; 

Code gesehen, die mich zu fragen, was dies tut, wenn, und wenn f unset($stmnt); anders wäre?

Das Handbuch gibt an, dass

Wenn die Abfrage vorbereitet wird, wird die Datenbank analysieren, kompilieren und seinen Plan optimieren die Abfrage für die Ausführung. [...] Durch Verwendung einer vorbereiteten Anweisung vermeidet die Anwendung die Wiederholung des Analyse/Kompilierungs-/Optimierungszyklus.

die tendenziell vorschlagen, sollten Sie die Anweisung nicht zuordnen, und MySQL hat die Fähigkeit. So

  1. Können Sie rufen DEALLOCATE PREPARE und wie
  2. Sollten Sie es tun?
  3. Und kann jemand bestätigen, dass das Setzen der Anweisung auf null (oder das Deaktivieren der Anweisung) dasselbe wie "free_result" für mysql_ und mysqli_ tun wird?
  4. Erfolgt es sofort, oder wartet es darauf, dass der Garbage Collector einsteigt?

Für Vollständigkeit, eine andere SO question Bezugnahme auf „free_result“ und „Schließen“ -Funktionen für mysqli_() legt nahe, dass die Aussage zu befreien Zeit tatsächlich fügt hinzu (es sei denn, Sie große Speichernutzung und brauchen den Raum). "Free_result" unterscheidet sich jedoch davon, den SQL-Server von der Zwischenspeicherung des vorbereiteten Status zu befreien.

+0

Möchten Sie emulierte Prepares gezielt abschalten? Standardmäßig werden die vorbereiteten Anweisungen im Treiber emuliert und am Ende der Anfrage freigegeben (wenn alles GCd ist). Was wäre der Sinn, sie ohnehin bewusst zu befreien? Der Leistungsgewinn wird durch die Wiederverwendung von vorbereiteten Anweisungen ermöglicht, wo dies möglich ist. Um Punkt 3 anzusprechen, wird [free_result aufgerufen, wenn eine Anweisung zerstört wird] (http://lxr.php.net/xref/PHP_5_4/ext/pdo_mysql/mysql_statement.c#55) (nicht gesetzt, Ende der Anfrage, usw.) - Ohne Tests glaube ich, dass die Dtors sofort aufgerufen werden. – Leigh

+0

Ja, ich ahme nicht nach - tut mir leid, hätte das in der Frage klarstellen sollen (aber ansonsten ist die Frage sinnlos). Warum sie befreien? Da es mehrere einzeln aufgerufene Anweisungen gibt, die für diese Verbindung nicht erneut verwendet werden, können sie ebenfalls freigegeben werden (die Optimierungen werden nicht zwischengespeichert). Diejenigen, die wiederverwendet werden, halte ich fest (bis sie nicht mehr benötigt werden, dann gilt die gleiche Frage, wie sie zu befreien sind). – Robbie

Antwort

3

Sollten PDO-vorbereitete Anweisungen nach der Verwendung freigegeben werden? Und wenn ja, wie?

Im Zusammenhang mit MySQL? Nein, warum?

PDO emulates prepared statements by default. Dies bedeutet, dass PDO selbst die Parameterersetzung, das Escaping usw. ausführt und SQL-Abschnitte entlang der Leitung sendet, anstatt native vorbereitete Anweisungen zu verwenden.

Während Sie es einschalten können, müssen Sie noch nicht zu ausdrücklich den Griff es sei denn, schließen Sie auch unbuffered queries verwenden. Lediglich die Anweisung handle außerhalb des Gültigkeitsbereichs oder die Einstellung auf null wird nicht Schließen Sie den Cursor. Auch hier ist nur wichtig, wenn Sie ungepufferte Abfragen verwenden.Wenn dies nicht der Fall ist, genügt es, den Bereich außerhalb des Bereichs zu belassen oder auf null zu setzen, um den Anfasser sauber zu schließen.

Sie haben auch eine Verbindung zu DEALLOCATE PREPARE hergestellt. Diese Syntax ist nur benötigt, wenn manuell Aufruf PREPARE mit einer SQL-Zeichenfolge. Dies ist eine vollständig und völlig separate Aktion als MySQL C-level API-based prepared statements, die PDO_MYSQL verwendet. (Okay, vielleicht verwenden Sie mysqlnd, aber es ist praktisch das Gleiche.)

+0

Entschuldigung - ich hätte klarstellen sollen, dass ich mich auf die Verwendung von wirklich vorbereiteten Aussagen stütze. Ich kann die Quelle nicht finden, aber ich erinnere mich, dass das Aufrufen von prepare() "PREAPRE" zur Datenbank aufruft - und das führt zu der Frage, ob ich DEALLOCATE PREPARE aufrufen soll. Ich werde testen, dass die PREPARE nicht so aufgerufen wird, wie Sie behaupten - ich habe alle Anfragen bei der Arbeit protokolliert, also werde ich mich an Sie wenden. Ich puffe keine Abfragen. Danke für die Antwort - ich werde an einem Tag nachgehen. – Robbie

+0

Wenn Sie die tatsächliche "PREPARE" SQL * überall * sehen, wenn Sie mit der Wire-Level-API arbeiten, die der C-Code (und mysqlnd) verwendet, werde ich einen Hut vor mir haben. Das wäre so ... * falsch * ... dass meine Gedanken für * Wochen * in die Luft gejagt würden, wie falsch es war. – Charles

+2

Kein Hut essen erforderlich - Ich habe nur die Protokolle überprüft und es ist genau so, wie Sie beschrieben haben. PREPARE wird nicht angezeigt, aber ein Aufruf von prepare() funktioniert - passend zu der C-Level-API, die Sie verknüpft haben. Und mysql_stmt_close (stmt)) scheint auch sofort aufgerufen zu werden, vermutlich wenn man in PHP den stmnt auf "null" setzt (limitiertes Testen natürlich, aber "stmt close" folgt immer im Log). Danke für die Hinweise - ich ruhe mich nach Osten aus, dass ich es richtig mache. – Robbie

0

Ja. Wenn Sie die Prepare-Anweisung abgeschlossen haben, können Sie sie auf NULL setzen oder unset() verwenden.

Für ein Skript mit mehreren Abfragen und großen Datenbanken macht dies einen Unterschied. Sie können testen, mit:

$before = memory_get_usage(); 
$stmt = NULL; 
die(memory_get_usage() - before); 

Für mich ist diese 20MB Arbeitsspeicher gespeichert, die das Skript später Absturz wurde.

+0

Die Frage ist nicht über PDO-Anweisung, sondern über vorbereitete Aussage. Um Ihre 20 MB zu speichern, sollten Sie eine ungepufferte Abfrage verwenden –

Verwandte Themen