Thread Welche Variante von fetch* mit DBI benutzen? (9 answers)
Opened by Gast at 2007-08-20 23:27

sid burn
 2007-08-26 15:38
#98689 #98689
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Zu der Performance.

Ich habe es nicht getestet, allerdiengs habe ich diese Infos aus "Prgrammieren mit Perl DBI" was ja immerhin auch vom DBI entwickler ist. Dort sagt er kurz und knapp folgende drei Sachen: (Ungefähr Sinngemäß wiedergegeben)

fetchrow_array = Langsam, wenn die Werte ausgelesen werden müssen, müssen sie später immer wieder in das neue Array kopiert werden.

fetchrow_arrayref = Deutlich schneller, da die Werte nur einmal ausgelesen werden, und dann einfach eine Referenz zurück gegeben wird.

fetchrow_hashref = Ist auch wieder langsam, da es intern relativ komplex sein soll die Tabellennamen auszulesen die für die Keys benötigt wird. Ob es jetzt langsamer als ein fetchrow_array ist weiß ich nicht, ich vermute ja. Ansonsten hat fetchrow_hashref aber noch paar mehr Nachteile. Wenn du beim Paramter eine Berechnung machst hast du relativ blöde Key namen, umgehen kannst du es dann mit einer Zuweisung der berechnung in einem leserlichen Namen im SQL. Identische Attributenamen aus unterschiedlichen Tabellen können ebenfalls Probleme hervorrufen. Ansonsten waren da glaube ich noch ein paar Sachen. Habe mir jedenfalls im großen und ganzen einfach nur gemerkt fetchrow_hashref() nicht zu nutzen. Auch wenn es sicherlich bequem ist.


Am schnellsten und das was am wenigsten Probleme bereit ist also fetchrow_arrayref. wenn du ein "SELECT *" machst kann dies natürlich wieder anders aussehen. Aber man sollte soetwas erst nie machen. Selbst wenn du alle Werte haben möchtest solltest du die werte einzelnt auflisten.

Noch schneller ist natürlich bind_column da du ihn die Referenzen vor dem auslesen schon mitgibst. Du sparst dir also das Kopieren einer Referenz bei fetchrow_arrayref. Allerdiengs kostet das kopieren einer Referenz nicht wirklich viel. Ist also kein großer Verlust. Vergleichen zur bind_column Variante ist dann Meiner Meinung nach die fetchrow_arrayref varinte lesbarer, und besser aufgebaut. Ich finde bind_column Variante nicht so toll, und es zerstreut meiner Meinung nach auslesen und setzen der Variablen im Sourcecode.


Ansonsten wenn du Performance Probleme hast, dann solltest du einen Profiler nutzen und erstmal die Schwachstellen identifizieren bevor du änderungen machst, die gar nicht ausschlaggebend sind.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Welche Variante von fetch* mit DBI benutzen?