Autor Beitrag
bbfan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: So 29.01.06 20:35 
Hallo!

ich habe derzeit so um 20.000 Datensätze zu aktualisieren.
Habe ein primitive Schleife gebaut, die pro Runde einen SQL Update Befehl über ADO sendet.

Gibt es noch einen schnelleren Weg?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 29.01.06 21:02 
Hast du den Transactions-Cache aktiviert? Das hilft wahre Wunde (15 Minuten für 250000 Datensätze auf 3 Sekunden) ohne den Source zu ändern.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Mo 30.01.06 09:49 
noch nie gehört... Wo/Wie aktiviere ich den?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 30.01.06 10:04 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
MyADOConnection.BeginTrans;
Try
  For i:=0 To 1000000 do 
    MySQLCommand.Execute;

  MyADOConnection.CommitTrans; // Kein Fehler aufgetreten? Dann Alles übernehmen
Except
  MyADOConnection.RollbackTrans; // Ooops, alles rückgängig machen
End;


Transactionen sind ein Mittel auf der DBMS-Seite, um die Integrität der Daten sicherzustellen. Egal was, egal wie, entweder sind ALLE Änderungen der Transaktion übernommen worden, oder Keine. Selbst bei einem Stromausfall Mittendrin.

Das klassische Beispiel hierfür ist eine Banküberweisung;
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Begin Transaction
Try
  Betrag X von Konto A abziehen
  Betrag X auf Konto B gutschreiben
  Commit Transaction
Except
  Rollback Transaction
End


Andere Möglichkeiten der Performanceverbesserung:
Erzeuge eine Stringliste, und pack die SQL-Anweisungen da rein. Es gibt ein Limit für die Gesamtlänge, glaub ich.
Ich schicke jedenfalls immer ca 100 Zeilen per ADOCommand.Execute los. Das könnte auch noch mal Einiges bringen.

_________________
Na denn, dann. Bis dann, denn.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 30.01.06 10:12 
Hallo!

Weitere Performancegewinne erreichst du, indem du nicht das SQL-Statement selber dauernd abänderst, sondern mit Parametern arbeitest.

Cu,
Udontknow
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mo 30.01.06 11:44 
Mit welcher Datenbank arbeitest du? Bei Oracle würde ich empfehlen, statt ADO die DOA-Komponenten ([url]allroundautomations.com[/url]) zu benutzen. Die unterstützen Array-DML, das heisst, du übergibst als Parameter der Query nicht einzelne Werte, sondern ein Werte-Array. Damit brauchst du das Statememnt nur einmal zu senden und die Datenbank führt es für jedes Arrayelement aus.

Stefan

_________________
Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.
Amiga-Fan
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: Mo 30.01.06 13:51 
wo kann man den Transaktionscache denn einschalten?

_________________
- Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Mo 30.01.06 14:18 
Das sind prima Vorschläge, die ich gleich mal ausprobieren werde.
Ich arbeite mit ADO zu einer AccessDatenbank hin.



ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 MyADOConnection.BeginTrans;  
Try  
  For i:=0 To 1000000 do   
    TADOQuery.execSQL; 
  MyADOConnection.CommitTrans; // Kein Fehler aufgetreten? Dann Alles übernehmen  
Except  
  MyADOConnection.RollbackTrans; // Ooops, alles rückgängig machen  
End;


Bei mir wird der SQL Befehl über TADOQuery abgeschickt. Ist das so richtig?
Der TADOQuery wird zuvor mit dem Befehl addQuery.sql.add mit 1 SQL Befehl gefüllt und mit exec ausgeführt.
Was für mich ganz wichtig ist, ist das die Schleife auch bei fehlgeschlagenem SQL weiterläuft und auch die anderen SQL Befehle durchgeführt werden.