AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TIBSQL vs isql-fb Shell

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

Registriert seit: 6. Mai 2011
543 Beiträge
 
#1

TIBSQL vs isql-fb Shell

  Alt 29. Apr 2019, 17:03
Datenbank: Firebird • Version: 2.5.6 • Zugriff über: fbclient.dll
Ich habe zu Performancetest einmal 10.000 Datensätze in eine Textdatei gespeichert und diese einmal in in einem Delphi Programm in einer Schleife mit TIBSQL ausgeführt und einmal auf der Shell ( Linux ) mit isql-fb .

Die SQL Anweisungen waren nichts anderes als:
Code:
INSERT INTO MYTABLE (FELD_SNR, FELD_1,FELD_2, FELD_3,FELD_4) VALUES( GEN_ID(GEN_MYTABLE_SNR,1), '1', '2', '3', '4');
Das ganze halt 10.000 untereinander und für isql-fb mit connect ... im Header.

Das Delphiprogramm (6, XE4, 10.1 ) benötigte dafür 30 Sekunden Client -> Server 1GBIT Netzwerk.
Auf der SHELL von Linux per isql-fb 3 Sekunden.

Mir war schon klar das über das Netzwerk aus deinem Delphiprogramm es langsamer sein wird. Aber Faktor 10?
Das ist übrigens in allen Konstellationen reproduzierbar auf verschiedenen Servern und verschiedenen Umgebungen z.b VMWare virtuelles Netzwerk 10GBIT.
Dabei fällt auf das sowohl Server als auch Clientprogramm sich langweilen. Ich komme auf evtl 6-7% CPU Auslastung auf dem Server und 10% auf dem Client (Windows 7/8/10).

Normal? Optimierungspotential? Falls ja, wo?!
  Mit Zitat antworten Zitat
hoika

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

AW: TIBSQL vs isql-fb Shell

  Alt 29. Apr 2019, 17:10
Hall,
tjaaaaaaa.

1.
Quellcode des Delphi-Programms fehlt

2.
Wo ist denn der Server?
Auf dem Linux-Rechner?


Falls 2.
Zitat:
Mir war schon klar das über das Netzwerk aus deinem Delphiprogramm es langsamer sein wird. Aber Faktor 10?
Dir ist schon klar, dass 10.000 Prepares übers Netz laufen.
Zusätzlich zu den 10.000 Executes.
Und dass es bei isql unter Linux statt zu IP-Zugriffen zu Local-IP (jaja, das heisst unter Linux anders! ) führt.

Wenn du fair wärst, würdest Du den Server zusätzlich unter Windows installieren und auch das isql benutzen.
Heiko

Geändert von hoika (29. Apr 2019 um 17:12 Uhr)
  Mit Zitat antworten Zitat
stalkingwolf

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

AW: TIBSQL vs isql-fb Shell

  Alt 29. Apr 2019, 17:39
beim aufbereiten des Codes zum posten ist mir eins aufgefallen.
von den 30 Sekunden benötigt das füllen von mysql.sql.text := sqlcode alleine 20sek.
D.h wenn ich die Schleife ohne execsql durchlaufe, braucht das ganze noch 20sek.
Das füllen von sql.text von TIBQuery oder TIBSQL ist das langsame.
Ich werde das morgen weiter testen und dann Quellcode posten.

2.) Firebird SQL 2.5.5 auf einem Suse Linux. Egal ob Classic oder Superserver

3.) ist ebenfalls egal. Haben wir auch getestet. Firebird Server unter Windows auf der gleichen Maschine auf welcher das Clientprogramm läuft. Auch 30sek.
ibsql-db auf der Windows Kiste habe ich aber nicht getestet.
  Mit Zitat antworten Zitat
hoika

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

AW: TIBSQL vs isql-fb Shell

  Alt 29. Apr 2019, 17:48
Hallo,

SQL.Text:=
würde ich auf jeden Fall ersetzen durch
SQL.Clear;
SQL.Add();

Zitat:
von den 30 Sekunden benötigt das füllen von mysql.sql.text := sqlcode alleine 20sek.
Das ist ein lokaler Aufruf, der auf meinem 486-er (Turbo !!!) gerade mal 50 msec braucht ...

ich warte
Heiko

Geändert von hoika (29. Apr 2019 um 17:51 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: TIBSQL vs isql-fb Shell

  Alt 29. Apr 2019, 18:03
Zitat:
würde ich auf jeden Fall ersetzen durch
Und Warum? Um es noch langsamer zu machen?
Ich würde die Abfrage eher parametrisieren.
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

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

AW: TIBSQL vs isql-fb Shell

  Alt 29. Apr 2019, 18:06
Hallo,
es geht doch (hier) um einen direkten Vergleich eines Delphi-Programmes und der Konsole.
Es wäre doch unfair gegenüber der Konsole, mit Prepare zu arbeiten
Heiko
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
543 Beiträge
 
#7

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 09:47
Zitat:
würde ich auf jeden Fall ersetzen durch
Und Warum? Um es noch langsamer zu machen?
Ich würde die Abfrage eher parametrisieren.
Das funktioniert in diesem Fall nicht. Es ist eine große ASCII Datei mit 10.000 SQL Befehlen ( insert ) die nur in der Schleife ausgeführt werden sollen.

Ich habe mittlerweile die meisten Performanceproblem Quellen gefunden.
Es war zum einen der mehrmalige Zugriff auf sql.text ( auch wenn es nur 50ms sind. Das mal 10.000 summiert sich und ich brauch das nachher eher in der 1.000.000 Region ).
Dann meine Logs welchen jede executetime in ein TMemo geschrieben hat zum auswerten.

Ich habe nun die reine Executezeit mit gettickcount davor und danach summiert und liege bei 11 Sekunden.

Geändert von stalkingwolf (30. Apr 2019 um 09:51 Uhr)
  Mit Zitat antworten Zitat
Fritzew

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

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 10: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.276 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 10: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 11:10 Uhr)
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
543 Beiträge
 
#10

AW: TIBSQL vs isql-fb Shell

  Alt 30. Apr 2019, 11: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
Antwort Antwort
Seite 1 von 2  1 2      


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 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz