Announcement

Collapse
No announcement yet.

Prepared Queries ohne Unprepare erlaubt?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prepared Queries ohne Unprepare erlaubt?

    Hallo,

    wenn ich in meiner Anwendung Queries vor dem ersten Open explizit präpariere, muss ich dann bei Programmende auch Unprepare aufrufen?

    Hintergrund: Ich habe festgestellt, dass manche meiner Queries für Unprepare erheblich Zeit benötigen (5 Sekunden), wodurch sich der Programmabschluss verzögert (da ich im OnClose des Datenmoduls für alle Queries mit (Prepared = True) Unprepare aufrufe). Verzichte ich nun auf Unprepare, erfolgt der Programmabschluss natürlich schneller. Ist das ok oder hinterlasse ich auf diese Art "Leichen" auf dem Interbase-Server (5.5) bzw. in meiner Datenbank?

    Mit feundlichen Grüßen,
    Markus Peters ([email protected])

  • #2
    Hallo,

    das explizite Aufrufen von Prepare macht nur dann Sinn, wenn die ungeänderte SQL-Anweisung mehrfach abgeschickt wird und es auf jede Millisekunde ankommt. Der Aufruf von Prepare vor dem Eintriff in einer Schleife ist ein klassisches Beispiel, wobei am Ende dann über Unprepare wieder aufgeräumt wird.

    Ansonsten sind die Vorteile verschwindend gering. Der InterBase Server hat einen eigenen Cache, in dem alle in der aktuellen Session abgeschickten Anweisungen "zwischengespeichert" werden. Ich würde daher Prepare/Unprepare nur in den begründbaren Fällen (siehe oben) einsetzen

    Comment


    • #3
      Hallo und danke für die Antwort.

      Im vorliegenden Fall sind die betroffenen Queries mit einer Mastersource jeweils an einen DataSet angehängt, so dass bei einem Datensatzwechsel in der Mastersource die jeweilige Query erneut ausgeführt wird. Dies kommt natürlich des öfteren vor, so dass sich ein Prepare lohnen könnte (wurde auch auf dem Entwicklerkongress empfohlen ;-).

      Aber zurück zu meiner eigentlichen Frage: Wenn ich also ein Prepare ausgeführt habe (aus welchen Gründen auch immer), <b>muss</b> ich dann später Unprepare aufrufen oder kann ich dies weglassen, ohne dass ich auf Dauer den Server mit vorbereiteten Abfragen zumülle (d.h.: bewirkt Prepare/Unprepare etwas auf dem Server oder lediglich in meiner Applikation)?

      Mit freundlichen Grüssen,
      Markus Peters ([email protected]

      Comment


      • #4
        Hallo,

        man könnte sich nun das Ganze schrittweise im Delphi-Debugger anschauen, indem beim Compilieren der Source-Pfad der VCL eingebunden wird. So sollte sich definitiv klären lassen, ob ein expliziter UnPrepare-Aufruf notwendig ist.
        Oder man vertraut der Delphi-Hilfe und ruft für jedex explizite Prepare ein entsprechendes Unprepare auf:
        <i>Mit Prepare können Sie Ressourcen für die BDE und einen Remote-Datenbank-Server für die Abfrage reservieren und zusätzliche Optimierungen durchführen. Wenn Sie vor der Ausführung einer Abfrage Prepare aufrufen, können Sie die Leistung einer Anwendung erhöhen.

        In Delphi wird eine Abfrage automatisch für die Ausführung vorbereitet. Nach der Ausführung gibt Delphi die Ressourcen frei, die der Abfrage zugewiesen waren. Wenn eine Abfrage wiederholt ausgeführt werden soll, sollte sie immer explizit vorbereitet werden.

        <b>Für die Vorbereitung einer Abfrage werden Datenbankressourcen benötigt. Aus diesem Grund sollte die Vorbereitung einer Abfrage aufgehoben werden, nachdem die Abfrage ausgeführt wurde. Um die Vorbereitung einer Abfrage aufzuheben, verwenden Sie die Methode UnPrepare.</b>

        Hinweis

        Wenn Sie den Text einer Abfrage zur Laufzeit ändern, wird die Abfrage automatisch geschlossen, und die Vorbereitung wird automatisch aufgehoben.
        </i&gt

        Comment

        Working...
        X