Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Was mache ich falsch? Firebird rattert wie irre auf der HDD (https://www.delphipraxis.net/93696-mache-ich-falsch-firebird-rattert-wie-irre-auf-der-hdd.html)

Gecko 9. Jun 2007 21:24

Datenbank: Firebird • Version: 2.0 • Zugriff über: Zeos

Was mache ich falsch? Firebird rattert wie irre auf der HDD
 
Hallo,

wollte mir einen kleinen Spamfilter schreiben und daher alle Wörter einer SpamMail in die DB packen und dann später noch in einer zweiten Spalte die Häufigkeit dazutragen.
Also Tabellenaufbau:

Spamwort | Häufigkeit

So schön so gut, erster Ansatz:

for I := 0 to SpamwordStringList.Count-1 do begin
qrsecond.SQL.Text:='INSERT INTO POSTEIN (SUBJECT) VALUES (:WORD)';
qrsecond.ParamByName('WORD').AsString:=SpamwordStr ingList.Strings[i];
qrsecond.ExecSQL;
end;

Sobald die Mails etwas grösser werden und sagen wir ein paar tausend wörter anfallen, fängt meine HDD gar fürcherlich für ca. 15-20 Sec an zu rappeln.
Ist das normal für meine Vorgehensweise oder mache ich Querymässig etwas falsch?

So etaws merke ich bei Spamfiltern von Thunderbird und co nicht...was machen die anders?

mkinzler 9. Jun 2007 21:33

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Der Vorteil von Parametern ist eigentlich, daß das Statement nur einmal an das DBMS gesendet werden muß. Diesen Vorteil nutzt du nicht
Delphi-Quellcode:
qrsecond.SQL.Text:='INSERT INTO POSTEIN (SUBJECT) VALUES (:WORD)';
for I := 0 to SpamwordStringList.Count-1 do begin
   qrsecond.ParamByName('WORD').AsString:=SpamwordStringList.Strings[i];
    qrsecond.ExecSQL;
end;
Wie hast du die Transaktionssteuerung eingestellt?

Gecko 9. Jun 2007 21:41

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Zitat:

Zitat von mkinzler

1. Der Vorteil von Parametern ist eigentlich, daß das Statement nur einmal an das DBMS gesendet werden muß. Diesen Vorteil nutzt du nicht

2. Wie hast du die Transaktionssteuerung eingestellt?

1. Habs mal so umgebaut, das bringt aber so gut wie nichts.

2. Ehrlich gesagt garnicht ;) Wo geht das? Und was sollte ich einstellen?

mkinzler 9. Jun 2007 21:45

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Ich vermute mal du verwendest AutoCommit, d.h. jeder Insert wird in eine eigene Transaktion gepackt und einzeln comitted.
http://www.dsdt.info/tutorials/zeosfirebird/?page=4

Gecko 9. Jun 2007 22:01

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Zitat:

Zitat von mkinzler
Ich vermute mal du verwendest AutoCommit, d.h. jeder Insert wird in eine eigene Transaktion gepackt und einzeln comitted.
http://www.dsdt.info/tutorials/zeosfirebird/?page=4

Zitat:

Dabei ist der sog. AutoCommit-Modus standardmäßig angeschaltet (True), was auch das Standardverhalten der BDE-Komponenten ist. Bei aktiviertem AutoCommit wird jedes einzelne SQL-Statement nach erfolgreicher Ausführung durch COMMIT bestätigt und die Änderungen in der Datenbank festgeschrieben. Soll dieses Verhalten ausgeschaltet werden und somit eine explizite Transaktion gestartet werden, in der man mehrere Datenbankzugriffe nacheinander durchführt, um diese als "Gruppe" durch COMMIT zu bestätigen, so muss die Methode StartTransaction aufgerufen werden. AutoCommit ist während einer expliziten Transaktion ausgeschaltet. Mit dem Aufruf der Methode Commit werden die Änderungen, die durch die Zugriffe in dieser Transaktion durchgeführt wurden, bestätigt. Der Aufruf der Methode Rollback macht diese Änderungen rückgängig. In beiden Fällen ist AutoCommit nach Methodenaufruf wieder eingeschaltet. Die explizite Transaktion ist beendet.

Wie mache ich das denn jetzt das er alles als eine Transaktion betrachtet? :cat:

mkinzler 9. Jun 2007 22:04

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Steht doch in dem Zitat. Vor der Schleife Transaktion starten und danach commiten.

Gecko 9. Jun 2007 22:13

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Hab ich gemacht, bringt aber in Sachen Rappelei 0,0 :(

Delphi-Quellcode:

qrsecond.SQL.Text:='INSERT INTO POSTEIN (SUBJECT) VALUES (:WORD)';
zconnection1.StartTransaction;

for I := 0 to sl.Count-1 do begin
qrsecond.ParamByName('WORD').AsString:=sl.Strings[i];
qrsecond.ExecSQL;
end;

zconnection1.Commit;

mkinzler 9. Jun 2007 22:16

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Wieviele Einträge willst du in einem Rutsch in die Datenbank schreiben?
Vielleicht wäre Insert Into ne Option

Gecko 9. Jun 2007 22:29

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Das waren jetzt ca. 8000 auf einmal. Aber auch bei 1000 rappelt es ja noch lang genug, und das ist ja kaum was...

Was meinst du mit Insert Into? das hab ich doch da?

Hansa 10. Jun 2007 01:04

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Jo, ist schon schlimm. Wieso werden immer im Klartext (innerhalb des Programms selbst) irgendwelche SQL-Statements zusammengebaut. Ihr kapiert einfach nicht, was eine Methode ist. :mrgreen: In diesem Fall ist das Insert und das würde so aussehen :

Delphi-Quellcode:
Dataset.Insert;
Dataset.Parambyname (...);
Dataset.post;
1000 DS ergibt dann wohl 1-10 Sek.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.
Seite 1 von 6  1 23     Letzte »    

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