Zeitdauer eines SQL Befehls

Hallo zusammen,

wieder einmal benötige ich euer Wissen und eure Erfahrung…

Ich habe einen Embedded PC mit Intel Atom Prozessor und SSD Festplatte. Dort habe ich unter Ubuntu 12.04 postgresql installiert, was als Localhost angesprochen wird. Zu Testzwecken habe ich eine Tabelle mit ein paar wenigen Spalten erzeugt.

Mit “insert into tabelle (spalte 1, spalte 2, spalte 3) values (1,2,3);” erstelle ich einen neuen Datensatz. Da das Embedded System natürlich so schnell wie möglich laufen sollte ;-), habe ich mit \timing Zeitmessungen gemacht und festgestellt, dass der Insert-Befehl im Bereich von 10ms - 100ms liegt. Auch andere Befehle wie Select oder Update liegen in diesem Bereich.

Deshalb meine Fragen:

  • sind meine Messwerte nach eurer Erfahrung im “normalen” Bereich?
  • gibt es eine Chance die Zugriffszeiten erheblich zu beschleunigen?

Ich habe mit pgtune schon ein wenig herumexperimentiert, ohne aber eine Verbesserung hinzubekommen.

Im Voraus herzlichen Dank,

Kalle

Ja, nun, …

Schreiboperationen sind vergleichsweise teuer, da immer ein fsync() erfolgt. Wie schnell das geht hängt sehr entscheidend von der Platte ab. SSD ist nicht zwingend schnell, ein gutes RAID10 mit SAS-Platten an einem guten Controller kann u.U. schneller sein. Was auch ganz wichtig ist, aber eher bei lesenden Zugriffen: RAM und eine korrekte Einrichtung der Speicherparameter in der postgresql.conf.

Um zu sehen, wie Abfragen ausgeführt werden, gibt es EXPLAIN und EXPLAIN ANALYSE mit weiteren Optionen - beschäftige Dich damit, das lohnt sich.

Ach ja: da die DB auf der selben Kiste tut wäre ein Zugriff via Socken :wink: schneller als via TCP/IP (hint: localhost ist TCP/IP)

Danke erstmal für die Tipps.

EXPLAIN und EXPLAIN ANALYSE werde ich mir mal genauer ansehen. An der Hardware kann ich erstmal nichts verbessern, schneller wird sie momentan nicht :wink:

Mit pgtune habe ich schon versucht die Einstellung in postgresql.conf zu ändern. Viel gebracht hat es leider nicht. Ich bin da im Moment noch etwas erschlagen von den ganzen Einstellung dort …

Guter Tipp mit dem Socket. Gleich kommen hier allerdings wieder neue Fragen auf:

  • Wie greift den psql auf die Datenbankzu? Ich kann mich nicht erinnern hier etwas eingestellt zu haben. Ist das standardmäßig per Socket oder TCP/IP?
  • Eigentlich greife ich von meiner eigenen Software über libpg auf die Datenbank zu. Dort hatte ich bisher eine Verbindung über TCP/IP. Mein Versuch dies nun über einen Socket zu machen, ist leider schief gegangen, keine Verbindung zur Datenbank möglich mit:
    conn = PQconnectdb(“user=postgres password=xxxxx dbname=xxxxx host=/var/run/postgresql port=5432”);
    Es kommt die Fehlermeldung: Peer authentication failed for user “postgres”

Mit host=localhost hat es funktioniert.

Was mache ich wohl falsch? Ideen sind wieder gerne willkommen :wink:

Depends. Ist sie lokal, dann Socken.

  • Eigentlich greife ich von meiner eigenen Software über libpg auf die Datenbank zu. Dort hatte ich bisher eine Verbindung über TCP/IP. Mein Versuch dies nun über einen Socket zu machen, ist leider schief gegangen, keine Verbindung zur Datenbank möglich mit:
    conn = PQconnectdb(“user=postgres password=xxxxx dbname=xxxxx host=/var/run/postgresql port=5432”);
    Es kommt die Fehlermeldung: Peer authentication failed for user “postgres”

Schau in die pg_hba.conf.

Andreas

nur mal so aus Interesse, da ich auch über die LibPG gehe, was für eine Software benutzt du ?

Tip : wenn ständig du viele INSERT z.b. “Import” von Daten hast, dann lege nur die Struktur der Table an und “fülle” die mit den COPY ( SQL ) Befehl

COPY MyTable FROM 'x:\TEMP\DATA.CSV' DELIMITER ';'

wobei ich hier “;” als Delimiter in der CSV verwende.

@Andreas

Habs jetzt geschafft über Socket auf die Datenbank zuzugreifen, allerdings mit einem andere Datenbankuser, mit postgres ging es einfach nicht. Warum weiß ich nicht, aber egal, es geht jetzt und ist auch schneller als über den Localhost. Danke für den Hinweis!!!

@Auge_ohr

Ich greife mit C/C++ und der Bibliothek libpq auf die Datenbank zu. Meine Software ist eine Ablaufsteuerung, die Parameter aus der Datenbank holt und Messergebnisse in der Datenbank abgespeichert.
Danke für den Tip mit copy. Ich glaube, das kann ich wirklich gut gebrauchen, es fallen doch einige Daten an…