noqqe


blog | sammelsurium | projects | about

PostgreSQL | 1000 und 1 Query

Zur Zeit spiele und bastle ich nebenher mit PostgreSQL rum. Überlege ob ich mal eine alternative DB für das Zombie-Revolution-Environment an den Start bringe…

Für meinen Use-Case scheint das allerdings nur begrenzt von Nutzen zu sein. Ich mache vielleicht etwas falsch, aber wenn ich 1000 Queries in MySQL kippe, dauert nur einen Bruchteil so lange wie in postgreSQL. Um das zu veranschaulichen:

$ time for x in $(seq 1 1000) ; do mysql -u root -ppw -e "insert into foobar.foo values ($x, now());" ; done
real    0m7.349s
user    0m0.060s
sys     0m0.380s
$ time for x in $(seq 1 1000) ; do psql --quiet -d foobar -c "insert into foobar values ($x, now());" ; done
real    1m28.363s
user    0m37.450s
sys     0m13.020s

Kann mir jemand sagen woran das liegt? Ich kann mir nur schwer vorstellen das PostgreSQL so hinterher hinkt.

Comments (3)

Knorkebrot on 2011-08-30T16:41:44
Ich bin kein PGSQL-Experte und das, was ich hier erzähle, habe ich gerade eben erfragt: psql geht bei einem Verbindungsaufbau deutlich mehr Securitymechanismen durch, was ihn viel teurer macht als bei MySQL. Ausserdem reserviert Postgre beim anlegen neuer Datensätze auch direkt den maximalen Speicher für dieses Feld, um nicht bei Änderungen evtl. nachbessern zu müssen während MySQL zu optimieren versucht, psql muss also mehr schreiben, aber mysql läuft Gefahr rumkorrigieren zu müssen. Interessant fände ich deswegen eher, wie schnell es wäre, wenn du eine Datei mit deinen 1000 SQL-Statements hast du die in einem Rutsch in psql und mysql reinschiebst. Würde zumindest eventuelle Differenzen beim Verbindungsaufbau vermeiden. MßG

noqqe on 2011-09-03T00:53:36
@Knorkebrot: Wow, nice. Okay hab ich wieder was gelernt. Bei wem haste das erfragt? Naja _aktuell_ ist das mit dem 1 connection per action leider mein Use-Case. Ein Event in ZRE passiert und zugleich wird es in die DB geschrieben. Vielleicht sollte ich die aber auch zu größeren Files zusammenmergen und dann in einem Rutsch reinschreiben... mh.

Knorkebrot on 2011-09-04T12:49:04
Von meinem (damaligen) Ausbilder habe ich das. Ich bin nicht unbedingt sehr fit im Shellscripting, kann man vielleicht die for-Schleife in Klammern setzen und deren Output in psql pipen? Dann hätte man das Problem auch nicht mehr. Habe leider gerade nichts zum testen da (bzw. meine neue Maschine baut gerade ;) )