AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TIBSQL vs isql-fb Shell

Ein Thema von stalkingwolf · begonnen am 29. Apr 2019 · letzter Beitrag vom 3. Mai 2019
Antwort Antwort
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 09:32
Wie sieht es mit den Transactions aus?
Starte eine Transaction explicit für Deine TIBSQL
nach dem ausführen natürlich das Commit nicht vergessen.
Fritz Westermann
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 09:40
Hallo,
mir fehlt immer noch der Quellcode des Delphi-Programms.
Das ISQL arbeitet doch bestimmt so clever,
dass er die Inserts nicht jedesmal zusammenbaut,
sondern sich merkt, dass es der gleiche Befehl ist.
Inwiefern da Prepare's benutzt werden, weiß ich nicht.

Und noch mal meine Frage:
Laufen beide Programme auf dem gleichen Rechner?
Heiko

Geändert von hoika (30. Apr 2019 um 10:10 Uhr)
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
549 Beiträge
 
#3

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 10:07
Hier der Quellcode. Beispiel mit TIBQuery nicht TIBSQL
Code:
procedure TForm1.bbexecClick(Sender: TObject);
var i,j        : integer;
    q          : TIBquery;
    command,
    line       : string;
    start,summe,
    t1,t2       : cardinal;

begin

    if input.lines.text = '' then exit;
   
    ibdb.DatabaseName := edDatabase.Text;
    ibdb.Connected   := TRUE;
    ibtrans.Active   := TRUE;

    bbexec.enabled   := FALSE;

    sb1.Panels[0].Text := ibdb.DatabaseName;
    caption := application.Title + ' - '+ibdb.DatabaseName;

    q:=tibquery.create(nil);
    q.UniDirectional:=FALSE;
    q.database     :=ibdb;

    output.lines.Clear;

    pb1.Position   := 1;
    pb1.Max        := input.lines.count;
    command        := '';
    summe          := 0;

    output.lines.add(format('%s - %s : Starte',[datetostr(date),timetostr(now)]));
    start := gettickcount;
    for i := 0 to input.lines.count -1 do begin

        pb1.Position:=i+1;

        command:=command+input.lines[i];

        if pos(';',input.lines[i]) = 0 then continue;

        try
            command:=stringreplace(command,#13#10,'',[rfReplaceAll]);
            command:=stringreplace(command,#13,'',[rfReplaceAll]);
            command:=stringreplace(command,#10,'',[rfReplaceAll]);


            q.sql.text := command;
            command    := '';
            t1          := GetTickCount;
            q.open;
            t2          := getTickcount;
            summe      := summe+(t2-t1);
            output.lines.add(format('EXEC Time : <%d>',[(t2-t1)]));

            if q.eof then begin
                output.lines.add('EOF : '+q.sql.text);
            end else begin

                while not q.eof do begin
                    line:='';
                    for j:=0 to q.FieldCount -1  do begin
                        if j = 0 then line:=q.FieldList[j].AsString
                        else line:=line+';'+q.FieldList[j].AsString;
                    end;
                    output.lines.add(line);
                    q.next;
                end;
            end;

        except
            on e:exception do begin
                output.lines.add(e.message);
            end;
        end;

        q.close;
    end;

    output.lines.add(format('%s - %s : Dauer Programm : %s sec ',[datetostr(date),timetostr(now),floattostr((gettickcount-start) / 1000)]));
    output.lines.add(format('%s - %s : Dauer Execute : %s sec ',[datetostr(date),timetostr(now),floattostr((summe) / 1000)]));

    if ibtrans.Active then ibtrans.CommitRetaining;


    output.lines.add(format('%s - %s : Ende ',[datetostr(date),timetostr(now)]));
    Application.ProcessMessages;

    q.free;
    bbexec.enabled:=TRUE;
    ibtrans.Active:=FALSE;
    ibdb.Connected:=FALSE;
end;
Bei dem durchführen auf dem gleichen Rechner (d.h Firebird unter Windows ). Ist der Unterschied 3(isql) zu 7(Delphi) Sekunden.

Letztendlich hat sich das ganze nun so gut wie geklärt. Ich habe nicht gedacht das die Interaktion mit der UI so extrem langsam ist. Ich habe dies nun auf einigen System (PC, VMWare Client, Hyper-V System ) getestet und es schwankt enorm.
Auf Hyper-V Systemen ist die Diskrepanz am größten.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 10:17
Hallo,
sehr gut.

Zitat:
output
das ist ja jetzt hoffentlich eine Stringlist und kein Memo?

5 Sachen sehe ich.

Zitat:
q.UniDirectional:=FALSE;
True setzen, du willst in der Query doch nicht per Prior zurücklaufen.

Zitat:
pb1.Position:=i+1;
Wieder ein Oberflächenelement, was sich 10.000 neu zeichnet
mache lieber sowas wie
Delphi-Quellcode:
if (i div 100)=0 then
begin
  pb1.Position:=i+1;
end;
also nur jeden 100. Eintrag zeichnen.
Wenn Max auf 10.000 steht, fällt ein Pos+1 nicht auf.

Zitat:
q.open;
Das habe und den ganzen Block mit dem q.eof habe ich überhaupt nicht verstanden.
Ein Insert wird über q.ExecSQL ausgeführt.

Zitat:
GetTickCount
Du ermittelst die Laufzeit jedes einzelnen Inserts.
Also 20.000 GetTickCounts.
Heiko

Geändert von hoika (30. Apr 2019 um 10:23 Uhr)
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
549 Beiträge
 
#5

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 11:05
Mir war klar das der Quellcode an Stellen auseinander genommen wird die keine Relevanz haben.
Daher hatte ich ihn nicht gepostet.

Aber zu den 5 Punkten oben.
1.) unidirectional stand vorher auf TRUE. Macht keinen Unterschied.
2.) Resultat soll direkt sichbar sein. Macht aber keinen Unterschied.
3.) siehe 2.
4.) Das Programm führt nicht nur insert, delete sondern auch select aus. Falls es ein select ist, wird die Ausgabe ausgegeben. Daher open und nicht execquery. Macht in meinen Test aber keinen Unterschied.
5.) Das ist doch der ganze Sinn der Sache.

@mkinzler
Siehe Punkt 3 und es ist ein gezielter Performancetest auf viele SQL Anweisungen.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 11:46
Hallo,
Punkt2 ist der Progressbar.
Natürlich macht es einen Unterschied, ob ich einen Befehl 10.000 mal
oder 100 mal ausführe.
An der Oberfläche sieht man natürlich nichts.

Das mit dem Select habe ich nicht verstanden,
wozu soll das gut sein?
Kommt da irgendwas aus der DB und muss verarbeitet werden?

Unidirectional
https://www.devart.com/ibdac/docs/de...irectional.htm

Ist denn da Ergebnis von isql das gleiche wie im Delphi-Programm,
halt nur schneller, oder wird dort weniger ausgegeben?
Heiko

Geändert von hoika (30. Apr 2019 um 12:06 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 13:44
Vorweg, ich hab den Code nicht angeschaut.

@hoika: Ich denke, es geht dem TE mit dem Open/Select um einen qualitativ realistischen Testcase, der zwecks Mittlung eben ein Volumen von 10000 Statements hat. Also echtes Select usw.

@TE: Dir muss bei einem solchen Vergleich schon bewusst sein, dass Du die berühmten Äpfel mit den ebenso berühmten Birnen vergleichst:

Die nahezu Abwesenheit von GUI in einer Concole ist schon mal offensichtlich.
Ähnlich die GUI Nutzung im Detail und mit ihrer zeitlichen Wirkung- wie schon geschrieben. GUI Zeichnen dauert, mit einer schlechten Graka notfalls lange.
Aber auch ohne GUI hast Du einen Effekt durch die Query selbst und wie sie die 10000 Einzelergebisse handhabt, wie u.a. auch der Hinweis auf Uniderectional zeigt. Du führst 10000 Operationen mit individuellen Folgeoperationen, Speicherallokationen usw. aus. Die Console schiebt stumpf die Statements an den Server, der gibt ASCI/UNI -CODE zurück, fertig, alles en block. Da wird am Client nichts allokiert, created, destroyed. Der Client haut die Zeichen auf den Screen, fertig.
IdR. ist eine Query Komponente nicht mal in der Lage, ein Script(mehr als einen Befehl hintereinander) auszuführen. Dafür gibt es separate Scriptkomponenten.
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 10:18
Warum führst Du das gesammte Skript nicht komplett aus und zerlegst es in einzelne Abfragen?
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz