Zeitmessung wie lange BEfehlt braucht

Hallo liebes Forum,


es gibt ja in Postgresql die Möglichkeit mit “EXPLAIN ANALYSE SELECT …”
sich auszugeben, wie lange es dauert, bis ein Befehl in der Datenbank braucht um abgearbeitet zu werden.

Dieses würde ich gerne mit PHP-Auswerten.

Ich versuche z.B.

$zeitabfrage=@pg_query("EXPLAIN ANALYSE SELECT bundesland from
 bundesland WHERE ST_Contains(the_geom, $punktgeometrie_start) AND
 ST_Contains(the_geom, $punktgeometrie_ende)");


$zeitabfrage_result=@pg_result($zeitabfrage,0,"QUERY PLAN");

echo "
";
echo "<b>Time 1: </b>".$zeitabfrage_result;
echo "
";

…leider ohne Erfolg. Kennt jemand eine Möglichkeit wie ich die Zeitdauer eines Befehls in PHP ausgeben kann?

Danke schon jetzt, Kai

Also die vielen @ werden regelmäßig deine Fehler verstecken, wenn welche auftreten. Das ist schlechter Programmierstil. Die Variablen einfach ungequotet in die Anfrage einzusetzen öffnet SQL-Injections Tür und Tor.

Dann gibt es da - ich glaube - gettimeofday() … oder war das in Perl? hmm zur Zeitmessung.

Zum Schluß würde mich noch interessieren, wo du die Funktion pg_result() gefunden hast … die kenne ich aus der offiziellen Dokumentation nicht.

Hi ads

Also die vielen @ werden regelmäßig deine Fehler verstecken, wenn welche auftreten. Das ist schlechter Programmierstil. Die Variablen einfach ungequotet in die Anfrage einzusetzen öffnet SQL-Injections Tür und Tor.

…stimme ich zu, das war auch nur hier auf die Schnelle…

Dann gibt es da - ich glaube - gettimeofday() … oder war das in Perl? hmm zur Zeitmessung.

Ja, im Prinzip gibt es für die Zeit eine ganze Menge Funktionen, aber leider nicht für das was ich suche:
Date/Time Functions and Operators

Zum Schluß würde mich noch interessieren, wo du die Funktion pg_result() gefunden hast … die kenne ich aus der offiziellen Dokumentation nicht.

Stimmt, jetzt wo Du es sagst, in der offiziellen Doku steht da wirklich nichts (vielleicht ist das sogar eine Problemursache, ich muss das wohl irgendwo mal als Codeschnipsel in dem Skript gefunden haben).

Danke und Viele Grüße, Kai

Hi ads,


Dein Tip hat auf die richtige Fährte gebracht.

Zunächst:
pg_result ist nicht mehr aktuell:

PHP: pg_fetch_result - Manual

(es heißt jetzt pg_fetch_result).

Mit folgendem Skript komme ich nah dran:

$zeitabfrage=pg_query("EXPLAIN ANALYSE SELECT name from
 types");
$zeilen_objekt=pg_num_rows($zeitabfrage);
for ($i=0;$i<$zeilen_objekt;$i++){
$zeitabfrage_result=pg_result_seek($zeitabfrage,$i);
$row = pg_fetch_result($zeitabfrage,0);
echo "
";
echo "<b>Time $i : </b>".$row;
echo "
";

}

Das Resultat dann:

Time 0: Seq Scan on types (cost=0.00…13.30 rows=330 width=204) (actual time=0.052…0.066 rows=4 loops=1)

Time 1: Total runtime: 0.168 ms


Das Problem: Wenn ich “EXPLAIN ANALYSE SELECT name from types” z.B. in phpPgadmin eingebe, dann erhalte ich z.B.

QUERY PLAN

Seq Scan on types (cost=0.00…13.30 rows=330 width=204) (actual time=0.051…0.065 rows=4 loops=1)

Total runtime: 0.161 ms

2 Datensätze

Laufzeit gesamt: 5.533 ms (Diese Zahl steht allerdings in keiner ausgegebenen Spalte)

SQL-Code ausgeführt.


Welche Zahl nun ist relevant frage ich mich…
Total runtime: 0.161 ms
Oder: Laufzeit gesamt: 5.533 ms

hmmh…

Könnte die Gesamtlaufzeit die Zeit in deinem Skript sein? Also mit allem drum und dran?

Die Zeit kommt in phppgadmin aus der sql.php Zeile 106 bis 166. Und da wird nix anderes gemacht als die Zeit “manuell” zu stoppen per microtime().

warum machst du nicht einfach ein ganz normales Resultset auf dein

EXPLAIN ANALYSE 
SELECT ...

(oder was auch immer) auf … diese anweisung liefert auch nur ein klassisches Ergebnis wie man es von einer DB-Abfrage erwarten würde

Das Ergebnis dieser Abfrage ist also eine Tabelle mit einer Spalte - da scrollst du schwups die wups zum letzten Datensatz resultset->last() {pseudocode}, in der einzigen aller möglichen spalten steht dann sowas:

Total runtime: 1422.389 ms

das kannst ja eigentlich genauso auch in irgendwelchen logs ausgeben .

Danke für die Antworten,

In der Tat ist “Total runtime: 0.161 ms” entscheidend.


“Laufzeit gesamt: 5.533 ms” in phppgadmin entsteht durch den php-overflow.

Viele Grüße, Kai