SQL Abfragedauer messen - Ergebnis in eine Zeile

Speedy18a4

Benutzer
Beiträge
5
Hallo,
ich möchte in einem 32Bit Programm (Delphi) die Abfragedauer einer SQL Query messen.

Das Problem ist, dass das Programm nur ein Ergebnis ausgeben kann.
Mein bisheriger Ansatz sah bisher so aus. Aber da gibt es 2 Ergebnisse.


declare @Time1 datetime
declare @Time2 datetime

SET @Time1 = GETDATE()

Select top 100000 *
FROM RechnungsPositionen

SET @Time2 = GETDATE()

select datediff(MILLISECOND,@Time1,@Time2) as 'Milli Seconds'
 
Werbung:
dann mach das doch einfach mit "time":

Code:
$ time psql test -c "select * from generate_series(1,10000)s" > /dev/null

real    0m0,043s
user    0m0,028s
sys    0m0,005s

Auf die Art kannst Du die Ausfürungszeit eines Kommandos ganz einfach messen. Unter Linux.
 
Das Delphi Programm hat einen integrierten SQL Abfrageeditor. Ähnlich wie SQL Management Studio. Darüber wollte ich das realisieren..
Mich interessiert die Abfragedauer am Client. Nicht am Server. Die Clients sind Windows
 
Zuletzt bearbeitet von einem Moderator:
@Speedy18a4
zu Delphi geht's hier lang
delphipraxis.net
Da bekommst Du 100% eine Antwort, 99% schnell.

Für Datenbankfragen bist Du hier richtig. Z.B. wenn der Timer anzeigt, Abfrage dauert 15 Sekunden.
 
Hallo.
Sorry für die späte Antwort.
Jetzt ist endlich mal Zeit sich um solche Themen zu kümmern.

Ich habe keinen Zugriff auf den Delphi Quellcode. Ich selbst möchte auch keine Ändeurngen an dem Delphi Projekt vornhemen.
Ich möchte nur erstmal die unterschiedlichen Geschwindigkeiten auf unterschiedlichen Clients/Servern ermitteln.

wenn ich set statistics time ON am Anfang aufrufe erhalte ich diesen Fehler.
"WorkSP: Parameter '@TranCount' nicht gefunden"

im Anhang 2 Screenshots.
Mein Problem ist dass ich in der Windows EXE nur eine Ergebnisliste erhalte.
Aber im SQL Management Studio gibt es mehrere.
Deshalb sehe ich dort auch das Zeit-Ergebnis und in der EXE nicht.
Meine Idee war, ob man diese Abfrage nicht irgendwie zusammenfassen kann.
So das am Ende nur die Abfragedauer als Ergebnis gelistet wird.
 

Anhänge

  • Win_EXE.jpg
    Win_EXE.jpg
    53,8 KB · Aufrufe: 11
  • SMSS.jpg
    SMSS.jpg
    43,7 KB · Aufrufe: 12
Abfragen aus unterschiedlichen Quellen können mit UNION ALL zusammengefasst werden.
Bei der Zeitabfrage (vorher/nachher) muss man beachten, dass bestimmte Funktionen immer die gleiche Zeit liefern (Transaktionsstart), egal wann sie aufgerufen werden. Wie das bei MS im Detail ist, weiß ich nicht.
 
Hallo
Mir ist nicht ganz klar was du zu erreichen versuchst.
Bei dieser Aussage sagst du dass du die Zeit auf dem Client messen willst.
Das Delphi Programm hat einen integrierten SQL Abfrageeditor. Ähnlich wie SQL Management Studio. Darüber wollte ich das realisieren..
Mich interessiert die Abfragedauer am Client. Nicht am Server. Die Clients sind Windows
Dann zeigst du in Posting #9 aber einen Screenshot der dir ein Ergebnis einer Berechnung auf dem Server anzeigt.

Das ist für mich ein Widerspruch.
Wo liegt überhaupt das Problem? Ist die Verarbeitung zu langsam und bist du auf der Suche nach einem Flaschenhals?
 
Das ist für mich ein Widerspruch.
Er schreibt ja dazu, dass er die Serverergebnisse nur als "Vorbild" für die Anzeige mehrerer Ergebnisse darstellt. Das möchte er in einem Client realisieren, wo er offenbar nur das SQL Statement als Variable hat.
Also mein Vorschlag in Pseudo Code, keine Ahnung, ob das mit der Ausführungsreihenfolge hinhaut und welche Zeitfunktionen da rein gehören.
Code:
select concat('startzeit', mssql-autonome-zeitfunkion())
union all
select top irgendwas  x.wert from <lasttest_tabelle> x
union all
select concat('stopzeit', mssql-autonome-zeitfunkion())
 
wenn ich set statistics time ON am Anfang aufrufe erhalte ich diesen Fehler.
"WorkSP: Parameter '@TranCount' nicht gefunden"

im Anhang 2 Screenshots.
Mein Problem ist dass ich in der Windows EXE nur eine Ergebnisliste erhalte.
Aber im SQL Management Studio gibt es mehrere.
Deshalb sehe ich dort auch das Zeit-Ergebnis und in der EXE nicht.
Meine Idee war, ob man diese Abfrage nicht irgendwie zusammenfassen kann.
So das am Ende nur die Abfragedauer als Ergebnis gelistet wird.
Wo bekommst Du den Fehler bei set statistics time on? In der exe? Wenn ja, muss ja die Exe die T-SQL Abfragen korrekt absetzen und das Ergebnis korrekt ausgeben. Also Client Problem. Im SSMS funktioniert das ja korrekt. Die Ausgabe von set statistics time on sieht man übrigens im Meldungstab.
 
Das Union wird nur klappen wenn die Statements den gleichen Typ zurückliefen und auch die selbe Spaltenanzahl.

Wenn man keinen Quellcode ändern will ist die Übung höchstens da um einen Flaschenhals ausfindig zu machen.
Dazu braucht man weder Delphi noch bringt die Abfrage einen wirklich zu einem aussagekräftigen, belastbaren Ergebnis.
Deswegen bleibt meine Frage offen - was ist der Zweck der Übung?.
 
Werbung:
@MDDaniel
das ist richtig. Ich suche nach Flaschenhälsen.

Ich habe 4 verschiedene Server/Client Systeme an unterschiedlichen Standorten welche mal mehr und mal weniger gut performen.

Die Abfrage an den Servern ist meiner Meinung nach nur die halbe Wahrheit.
Da sehe ich zwar grob wie schnell der SQL ist aber nicht wie schnell die Daten vom Client gelesen/übertragen und angezeigt werden.
Deshalb war meine Idee die Abfrage direkt im Windows Client zu testen.
Warum ist das Ergebnis deiner Meinung nach nicht belastbar?


@t-sql
auch korrekt. Der Fehler kommt nur im Windows Client. Nur kann ich daran leider nichts ändern.


Ich glaube jetzt habe ich ein Henne-Ei Problem.
Union ALL geht nicht weil "SET @Time2" dazwischen ist.
Das brauche ich aber um die Differenz zu berechnen.


declare @Time1 datetime
declare @Time2 datetime
SET @Time1 = GETDATE()

Select top 1000 0 as 'Milli Seconds' FROM RechnungsPositionen
SET @Time2 = GETDATE()

Union ALL
select datediff(MILLISECOND,@Time1,@Time2) as 'Milli Seconds'
 
Zurück
Oben