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
- Können Sie rufen
DEALLOCATE PREPARE
und wie - Sollten Sie es tun?
- 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?
- 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.
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
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