Freigeben von vorbereiteten PDO-Statements (DEALLOCATE PREPARE)

9

Sollten PDO-vorbereitete Aussagen nach der Verwendung freigegeben werden? Und wenn ja, wie? Ich frage speziell nach MySQL - wie können Sie und sollten Sie DEALLOCATE PREPARE nennen? obwohl PDO. (Edit: Zur Verdeutlichung bezieht sich diese Frage nicht auf emulierte Prepares, sondern bereitet sie wirklich vor.)

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

Erläuterung:

Ich habe Code in den Zeilen von

gesehen %Vor%

was mich dazu gebracht hat, mich zu fragen, was das bedeutet, wann und ob unset($stmnt); anders wäre?

Das Handbuch zeigt dies an

  

Wenn die Abfrage vorbereitet ist, wird die Datenbank analysieren, kompilieren und   Optimieren Sie seinen Plan zum Ausführen der Abfrage. [...] Mit einem vorbereiteten   Anweisung die Anwendung vermeidet die Wiederholung der   Zyklus analysieren / kompilieren / optimieren.

was darauf hindeutet, dass Sie die Anweisung nicht zuordnen sollten, und MySQL hat die Fähigkeit. Also,

  1. Können Sie DEALLOCATE PREPARE und wie
  2. aufrufen?
  3. Solltest du es tun?
  4. Und kann jemand bestätigen, dass das Setzen von statement auf null (oder das Unscharfschalten der Anweisung) dasselbe wie "free_result" für mysql_ und mysqli _?
  5. tut
  6. Tritt es sofort ein oder wartet es darauf, dass der Garbage Collector eingreift?

Der Vollständigkeit halber SO Frage bezieht sich auf "free_result" und "close" Funktionen für mysqli_() legen nahe, dass das Freigeben der Anweisung tatsächlich Zeit hinzufügt (es sei denn, Sie haben eine große Speicherbelegung und benötigen Speicherplatz). "Free_result" unterscheidet sich jedoch davon, den SQL-Server davon zu befreien, die vorbereitete Anweisung zwischenzuspeichern.

    
Robbie 26.11.2012, 05:42
quelle

2 Antworten

3
  

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

Im Zusammenhang mit MySQL? Nein. Warum?

PDO emuliert standardmäßig vorbereitete Anweisungen . Dies bedeutet, dass PDO selbst die Parameterersetzung, das Escaping usw. ausführt und Teile von SQL in die Zeile sendet, anstatt native vorbereitete Anweisungen zu verwenden.

Während Sie es einschalten können, müssen Sie nicht ausdrücklich den Handle schließen, es sei denn verwenden Sie auch ungepufferte Abfragen . Lässt man die Anweisung nur außerhalb des Gültigkeitsbereichs oder auf null setzen, schließt nicht den Cursor. Auch hier ist nur von Bedeutung, wenn Sie ungepufferte Abfragen verwenden. Wenn dies nicht der Fall ist, reicht es aus, den Gültigkeitsbereich zu verlassen oder auf null zu setzen, um den Anfasser sauber zu schließen.

Sie haben auch eine Verknüpfung mit DEALLOCATE PREPARE hergestellt. Diese Syntax wird nur benötigt, wenn manuell aufgerufen wird PREPARE mit einer SQL-Zeichenfolge. Dies ist eine vollständig und völlig separate Aktion als MySQL C- Level-API-basierte vorbereitete Anweisungen , was PDO_MYSQL verwendet. (Okay, vielleicht verwenden Sie mysqlnd , aber es ist im Grunde dasselbe.)

    
Charles 08.12.2012, 06:50
quelle
0

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

Für ein Skript mit mehreren Abfragen und großen Datenbanken ist dies von Bedeutung. Sie können testen mit:

%Vor%

Für mich hat das 20 MB Speicherplatz gespart, was das Skript später zum Absturz brachte.

    
Full Decent 18.05.2016 17:07
quelle

Tags und Links