Zeitmessung wie lange Datenbank-Abfrage braucht

Kai-Behncke

Erfahrenes Mitglied
Hallo liebe Leute,


ich habe eine Applikation mit relativ umfangreichen Datenbankabfragen.


Ich suche eine Möglichkeit mir in PHP anzeigen zu lassen, wie lange eine solche Abfrage dauert.

Gefunden habe ich bisher:

Code:
function uniqueTimeStamp() {
  $milliseconds = microtime();
  $timestring = explode(" ", $milliseconds);
  $sg = $timestring[1];
  $mlsg = substr($timestring[0], 2, 4);
  $timestamp = $sg.$mlsg;
  return $timestamp; 
}
$start = uniqueTimeStamp();

  //Abfrage ob Start/End-Punkt in Geometrie eines Bundeslandes liegen
$bundesland_abfrage=@pg_query("SELECT * from bundesland WHERE ST_Contains(the_geom, 
$punktgeometrie_start) AND ST_Contains(the_geom, $punktgeometrie_ende)");

$bundesland_result=@pg_result($bundesland_abfrage,0,bundesland);

$ende = uniqueTimeStamp();

$differenz = $ende-$start;
$differenz = $differenz/10; // warum auch immer
$differenz = (int)$differenz;

echo "Die Ausführung dauerte $differenz ms";

Das Problem: Diese Abfrage ist nicht identisch dazu, wenn ich z.B. direkt in der Datenbank mir die Zeit ausgeben lasse mit:

Code:
EXPLAIN ANALYZE SELECT * from bundesland WHERE ST_Contains(the_geom, 
$punktgeometrie_start) AND ST_Contains(the_geom, $punktgeometrie_ende)

In dem PHP-Skript bekomme ich immer etwas höhere Werte (ca. +15 ms) heraus.

Woran könnte das liegen?
Sind das vielleicht "Mehrkosten" für das Ausführen der Funktion?

Gibt es eventuell eine andere,bessere Art und Weise der Zeitmessung?

Danke, Kai
 
Klar, das ist die Zeit der Funktion selbst.
Innerhalb von PHP selbst die Zeit zu messen ist problematisch, da man den Overhead nicht mitkriegt. Was man mit so einer Zeitmessung macht, ist die Zeit zwischen zwei Punkten ausmessen. Außerhalb dieser Punkte befinden sich aber immer: Parser etc. - eine gewissen "Vorbereitungszeit" durch PHP selbst.

Liefert nicht EXPLAIN selbst eine Art Tabelle, von der man die Zeit auslesen kann?
 
Hallo ZodiacXP,

vielen Dank für die Antwort zunächst.

Ich hatte auch gehofft, ich könnte den zurückgelieferten Wert der DB direkt auslesen, so in der Art:

Code:
$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 "<br>";
echo "<b>Time 1: </b>".$zeitabfrage_result;
echo "<br>";


Query Plan ist in diesem Falle die rückgelieferte Spaltenüberschrift, aber leider funktioniert das nicht, das gibt immer wieder eine Fehlermeldung.......
 
Ich habe nu n eine Lösung gefunden:

Code:
$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 "<br>";
echo "<b>Time $i : </b>".$row;
echo "<br>";

}

Das ergibt dann z.B.:

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

Danke nochmals und Grüße, Kai
 
Zurück