Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9053[/thread]

Allg. Frage zum Speichern von Datenbankabfragen: DBI (Seite 2)

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Duff
 2007-06-02 19:52
#77158 #77158
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke für die ausführlichen Erklärungen.

Wo genau besteht denn der Unterschied zwischen dem prepare und execute?
Execute wird wohl für die Ausführung des SQLs sein. Ist perpare dann sowas wie eine Prüfung auf Richtig des Statements oder so?
D'OH
Daniel
nepos
 2007-06-02 21:16
#77159 #77159
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nein, es gibt bei Datenbanken sogenannte Prepared Statements. Das heißt, die Datenbank kann durch den Prepare das Statement intern quasi vorbereiten, was bei Anweisungen in Schleifen sehr praktisch ist, da man dann nur noch die Parameter reinstecken muss und so etwas mehr Performance rausholt. Allerdings bringt das nicht bei allen Datenbanken was...

Persönlich mache ich es oft so, dass ich bei Abfragen gleich die selectall_hashref() oder selectall_arrayref() benutze und für INSERT, UPDATE und DELETE gleich do() benutze.
Es hängt halt immer davon ab, was genau du da machst. Bei sehr vielen Daten sind die selectall_xxxref()-Funktionen vielleicht nicht so optimal. Ebenso das einfache do(), wenn man damit z.B. sehr viele INSERTs aufrufen will. Da ist dann prepare+execute die bessere Wahl.
sid burn
 2007-06-04 01:47
#77160 #77160
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Also ich finde prepare hat da noch andere Vorteile.

Man kann das schreiben der SQL Befehle an einer Stelle lagern, und nicht gemischt irgendwo im Code. Zum einen sieht das häßlich aus, zum anderen finde ich ist das nicht gerade übersichtlich.

Sprich Datenbank Handle aufbauen, SQL Befehle zusammen bauen die man braucht und fertig. Das das natürlich nicht immer so geht sollte glaube ich klar sein.

Ansonsten kannst du später dann in einer Schleife nur noch das execute mit dem Parameter benutzen. Das ist meiner Meinung dann deutlich übersichtlicher.

Ansonsten stell dir vor du machst das prepare in einer while Schleife die 100.000 mal ausgeführt wird. Also wird auch das prepare 100.000 mal vorbereitet. Womöglich ist das SQL auch noch 100.000 mal identisch. Absolute Performance verschwendung..

Sehr viel Sinnvoller das prepare vor der Schleife zu machen (oder halt an einer zentralen Stelle wo alle SQL Statements stehen), und in der Schleife dann nur noch das execute auszuführen. Bei den select* Funktionen sollte das denke ich identisch sein. Nur wird prepare und execute in einer Befehl gleichzeitig erledigt. Also genau das selbe als wenn man prepare und execute ständig in einer Schleife aufruft.

Für einzelne Aufrufe nicht in einre Schleife denke ich aber volkommen okay.

Hab da aber noch nie irgendetwas in der Richtung gebenchmarkt.\n\n

<!--EDIT|sid burn|1180907295-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-05-31 13:00.