Ich möchte eine Abfrage mit einer benutzerdefinierten Funktion vergleichen, die ich für PostgreSQL geschrieben habe. Gibt es Standardmethoden, um einen solchen Benchmark durchzuführen?
Ich weiß, dass das Timing mit \timing
der psql-Eingabeaufforderung aktiviert werden kann, aber im Idealfall hätte ich gerne ein Skript, das alles automatisch erledigt: die Abfrage ein paar Mal ausführen und den PostgreSQL-Cache nach jedem Lauf löschen (wahrscheinlich durch Neustart der PostgreSQLs) Service) und die Ausgabe der durchschnittlichen Laufzeit (und des verwendeten Speichers ist ein Plus).
postgresql
benchmark
Franck Dernoncourt
quelle
quelle
pgbench
; Sie können es mit benutzerdefinierten Skripten ausführen, um einige der gewünschten Aktionen auszuführen. Mit einem Wrapper-Shell-Skript zum Stoppen und Neustarten von Pg und zum Löschen des Betriebssystem-Festplatten-Cache haben Sie das meiste, was Sie brauchen.Antworten:
Das am häufigsten verwendete Tool ist der SQL-Befehl
EXPLAIN ANALYZE
, möglicherweise mit mehr Optionen für weitere Details in der Antwort. Das gibt den Abfrageplan mit den Planerschätzungen und den tatsächlichen Ausführungszeiten aus.Warum soll der Cache geleert werden? Der allgemein wahrscheinlichere Anwendungsfall ist, dass der Cache gefüllt ist. Wenn Sie diesen Weg immer noch einschlagen möchten, finden Sie hier eine Antwort auf SO .
Wenn Sie den Cache nicht zurücksetzen, haben Sie zwei einfache Möglichkeiten, ihn mit vielen Iterationen zu testen:
Einfaches UDF
Oder mit Zufallseingabe - Zufallszahlen zwischen 0 und 5000 im Beispiel:
Oder mit einem echten Tisch:
Komplexere Funktionen / Abfragen
Anruf:
Achtung : Die Abfrage wird tatsächlich ausgeführt!
Achtung : Nicht für den öffentlichen Gebrauch geeignet. Mögliche SQL-Injection.
Bei Bedarf können Sie auch hier zufällige Parameter verwenden. Möglicherweise mit der
USING
Klausel vonEXECUTE
.quelle