Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Updates mit Zeos/MySQL dauert zu lange? (https://www.delphipraxis.net/82315-updates-mit-zeos-mysql-dauert-zu-lange.html)

dbdeath74 13. Dez 2006 10:49

Re: Updates mit Zeos/MySQL dauert zu lange?
 
Zitat:

Zitat von hoika
Hallo,

so wie es in den Quellen (6.5.1. Alpha) aussieht,
wird immer prepared.
Ab 4.1 wird das Prepare von mysql übrigens erst unterstützt.

Solange das Statement sich nicht ändert,
bleibt die Query prepared.
Das heisst in deinem Fall, einfach eine parametrisierte Query
benutzen und den SQL-Text NICHT jedesmal zuweisen,
oder anderes gesagt.
Nimm eine separate Query, schreibe den SQL-Text (parametrisiert) einmal rein
und rufe dann immer nur Open bzw. Execute auf.


Heiko
PS: es muss doch auch nen SQL-Monitor geben,
wo man das Preparen der Query sehen kann.
Ich gehe ohne den sqlmonitor gar nicht ausser Haus ;)

Hallo,

hörte sich in der Theorie klasse an *g :)

Hat leider fast keine Geschwindigkeitsvorteile gebracht :(

Gruß Oliver

hoika 13. Dez 2006 13:07

Re: Updates mit Zeos/MySQL dauert zu lange?
 
Hallo,

dann zeige doch noch mal diese Stelle,
wie sieht es eigentlich mit Transaktionen aus ?
Vor der Schleife StartTransaction und danach ein Commit;

Und knips endlich den SQL-Monitor an ;)


Heiko

dbdeath74 13. Dez 2006 14:37

Re: Updates mit Zeos/MySQL dauert zu lange?
 
Hallo,

öhmm welchen SQL Monitor meinst du?
Für mySQL kenne ich nur das was mir der mySQL Administrator mitliefert.

Hier mal 3 Sekunden Ausschnitt mit parametriesiertem Query.
Benutzt wird ZQuery Komponente. Meine Applikation bremst es auch nicht, die langweilt sich bei 5% Prozessorlast.
Beim der MSSQL version habe ich an dieser Stelle Prozessorlast ca 80%, einfach weil es viel schneller geht und er viel mehr zu tun hat.

MySQL schafft einfach nicht mehr wie ca 10 Updates pro sekunde :(
Aber auch der mySQL Dienst langweilt sich und hat kaum Prozessorauslastung(5%).

Die Tabelle aufm mySQL ist im InnoDB Format, hat einfach 4 Integer, 2 varchars und ein bit feld. Primary Key ist auf der ID über die ich ja auch das Update mache.
Ansonsten hat die Tabelle nur noch einen weiteren Index auf ein weiteres Feld das ich woanderst häufig zur Suche brauche.

Ich frage mich halt wer hier auf wenn und warum wartet *g

So baue ich die Query jetzt auf:
Delphi-Quellcode:
with QryLastScan do
    begin
      SQL.Clear;
      SQL.Add('UPDATE CMDB_Software_Scan SET LastScan =:ScanDate ');
      SQL.Add(', Aktiv = 1');
      SQL.Add(' WHERE ID = :ID');
    end;
Und so Rufe ich sie auf:
Delphi-Quellcode:
with QryLastScan do
begin
  ParamByName('ScanDate').AsString := QuotedStr(DateTimeToStr(scanDate));
  ParamByName('Id').AsInteger:= ScanId;
  ExecSQL;
end;
Und hier mal ein 3sec AUsschnitt ausm mySQL Administrator

SQL-Code:
061213 13:29:09         5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2240
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2241
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2242
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2243
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2244
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2245
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2246
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2247
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2248
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2249
061213 13:29:10         5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2250
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2251
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2252
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2253
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2254
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2255
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2256
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2257
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2258
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2259
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2260
061213 13:29:11         5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2261
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2262
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2263
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2264
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2265
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2266
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2267
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2268
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2269
            5 Query      UPDATE CMDB_Software_Scan SET LastScan ='\'13.12.2006 13:10:58\'' , Aktiv = 1 WHERE ID = 2270
Ich habe jetzt mal testweise etwas gebastelt mit directSQL. Der Schafft auch nicht mehr wie 10 Updates pro sekunde :(

Transaktionen verwende ich nicht, da ich erstens alleine schreibzugriff habe und zweitens einfach nur ein Update machen will :p
Transaktionen sollten doch auch meines Wissens nichts mit der Geschwindigkeit zu tun haben, sondern es eher noch langsamer machen weil er ja Rollbackpunkte etc... bereithalten muss. Lasse mich aber gerne eines besseren belehren :)

Gruß Oliver

Thanatos81 13. Dez 2006 14:49

Re: Updates mit Zeos/MySQL dauert zu lange?
 
Bei den Zeos gibt es eine Komponente TZSQLMonitor. Falls diese aktiv ist protokolliert die alle Befehle und Fehlermeldungen mit, die über deine TZConnection wandern ;-) Falls man nur bestimmte Meldungen protokollieren will, sollte man sich das Ereignis OnLogTrace anschauen.

hoika 13. Dez 2006 14:53

Re: Updates mit Zeos/MySQL dauert zu lange?
 
Hallo,

also unter Firebird (BDE, jaja ;) ) ist das so:

Wird keine Transaktion manuell (DataBase.StartTransaction) gestartet,
erzeugt die BDE für JEDE Abfrage eine Transaktion und Committed die.
Das ist bei bestimmten Sachen um Faktor 20 langsamer,
als einmal eine Transaktion zu starten,
alle Updates machen und dann Committen.

Sind die IDs eigentlich immer aufsteigend ohne Lücken ?
Dann würde ja ein Where Id>=Min and Id<=Max reichen ;) :coder:

Heiko

dbdeath74 13. Dez 2006 15:54

Re: Updates mit Zeos/MySQL dauert zu lange?
 
Zitat:

Zitat von hoika
Hallo,

also unter Firebird (BDE, jaja ;) ) ist das so:

Wird keine Transaktion manuell (DataBase.StartTransaction) gestartet,
erzeugt die BDE für JEDE Abfrage eine Transaktion und Committed die.
Das ist bei bestimmten Sachen um Faktor 20 langsamer,
als einmal eine Transaktion zu starten,
alle Updates machen und dann Committen.

Sind die IDs eigentlich immer aufsteigend ohne Lücken ?
Dann würde ja ein Where Id>=Min and Id<=Max reichen ;) :coder:

Heiko

Hallo,

GENIAL !!!! :love: :dp: :mrgreen:

Faktor 20 ist gar kein Ausdruck *g hab jetzt 1/3 Sekunde pro Gerät statt 8 sec.
Er macht wirklich wenn man nichts sagt jedesmal eine Transaction.

Achja, MSSQL mit ADO Komponenten macht dies anscheinend nicht. Hier brachte Transaktion keinerlei Vorteile.

Und nein die IDs sind nicht immer aufsteigend, das war nur Zufall weil es auf der Testversion war.

Gruß Oliver

hoika 13. Dez 2006 16:34

Re: Updates mit Zeos/MySQL dauert zu lange?
 
Hm,

jetzt habe ich dich noch mehr an mysql rangebracht,
statt dich für Firebird zu begeistern, ich Dussel ;)

Egal. :cheers:


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 Uhr.
Seite 2 von 2     12   

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