AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Append Code optimieren aber was macht Sinn?
Thema durchsuchen
Ansicht
Themen-Optionen

Append Code optimieren aber was macht Sinn?

Ein Thema von Piro · begonnen am 1. Dez 2010 · letzter Beitrag vom 1. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 11:15
Datenbank: MS SQL 2005 • Version: Express • Zugriff über: ADO
Moin zusammen,

Ich lesen ca. 1000 Datensätze mit folgendem Code ein, welcher ca. 15 Sekunden dauert. Ich verwende TADOConnection und TADODataSet.

Delphi-Quellcode:
...
 if FileExists(path_canban) = True then
 begin
   AssignFile(F, path_canban);
   Reset(F);

   while not EoF(F) do
   begin
     Readln(F, zeile);
     sl_zeile := Split(zeile,';', True); // ist nicht das Problem
     Inc(counter);

     try
       DSData.Close;
       DSData.CommandText := 'Select * from fullload_data';
       DSData.Open;

       DSData.Append;
       DSData.FieldByName('lname').AsString := sl_zeile[0];
       DSData.FieldByName('sachnr').AsString := sl_zeile[1];
       DSData.FieldByName('benennung').AsString := sl_zeile[2];
       DSData.FieldByName('zeichnungsnr').AsString := sl_zeile[3];
       DSData.FieldByName('lagerbestand').AsString := sl_zeile[4];
       DSData.FieldByName('liefermenge').AsString := sl_zeile[5];
       DSData.FieldByName('mindestbestand').AsString := sl_zeile[6];
       DSData.FieldByName('abrufnr').AsString := sl_zeile[7];
       DSData.FieldByName('tag').AsString := sl_zeile[8];
       DSData.FieldByName('abrufnr_zusatz').AsString := sl_zeile[9];
       DSData.FieldByName('aindex').AsString := sl_zeile[10];
       DSData.FieldByName('lieferort').AsString := sl_zeile[11];
       DSData.FieldByName('position').AsString := sl_zeile[12];
       DSData.FieldByName('kenn_es').AsString := ''; //sl_zeile[13];
       DSData.FieldByName('lnr').AsString := ''; //sl_zeile[14];
       DSData.Post;

       DSData.Close;
     Except
       //
     end;
   end;
   tbtn_fullload_import.Enabled := False;
 end;
...
In der Zukunft können sich die Daten verdoppeln. So, dass das Program 30 Sekunden braucht. Das ist nicht wirklich schlimm aber kann man es noch optimieren?

Ich habe es schon mit BULK INSERT versucht. Geht verdammt schnell. Leider gibt es ein paar Sachen, die dann nicht mehr funktionieren, die ich wärend des Insert benötige.

Über TADOQuery könnte man es auch machen aber ich weiß nicht, ob der Unterschied so groß ist. Bei TADODataSet habe ich auch schon die Eigenschaft Prepare=True gesetzt. Passiert aber nichts.

Meine Idee wäre, alle Daten mit Append in die Datenbank schreiben und zum Schluss ein Post. Leider habe ich dann nur einen Datensatz in der DB.

Habe das Forum schon einwenig durchsucht, was mich nicht weitergebracht hat.

Vielleicht sieht ja einer meinen Quellcode und weiß sofort, wo man was optimieren kann. Verständnisfehler sind nicht ausgeschlossen.

Vielen Dank im Voraus.
Sven
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 11:21
Am besten einen BULK-INSERT selbst zusammenbauen (so 10-50 Inserts)
Code:
INSERT INTO fullload_data(...) VALUES(...)
INSERT INTO fullload_data(...) VALUES(...)
INSERT INTO fullload_data(...) VALUES(...)
INSERT INTO fullload_data(...) VALUES(...)
und dann als ein Statement zur DB senden.


und immer schön mit parametern und prepared Statements arbeiten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#3

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 11:26
Das andauernde FieldByName macht die Sache sicherlich auch nicht schneller. Hast du es schon mal mit persistenten Feldern versucht ?
Glückauf
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#4

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 11:29
Wenn du dieses außerhalb der Schleife nur einmal machst?
Delphi-Quellcode:
DSData.Close;
DSData.CommandText := 'Select * from fullload_data';
DSData.Open;

// und

DSData.Close;
Das mit dem .Post ist klar. Da werden dann jedesmal die gleichnamigen) Werte überschrieben und dann am Ende alles nur einmal abgesendet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 11:33
Wenn ich jetzt nicht völlig blind bin, würde ich sagen, dass das ständige Öffnen und Schliessen des DataSet überflüssig ist.

Frank

EDIT:
Code:
if FileExists(path_canban) = True then
begin
  AssignFile(F, path_canban);
  Reset(F);
  DSData.Close;
  DSData.CommandText := 'Select * from fullload_data';
  DSData.Open;
  while not EoF(F) do
  begin
    Readln(F, zeile);
    sl_zeile := Split(zeile,';', True); // ist nicht das Problem
    Inc(counter);
    try
      DSData.Append;
      DSData.FieldByName('lname').AsString := sl_zeile[0];
      DSData.FieldByName('sachnr').AsString := sl_zeile[1];
      ..
      DSData.Post;
    Except
      //
    end;
  end;
  DSData.Close;
  ...
Frank Reim

Geändert von dataspider ( 1. Dez 2010 um 11:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 12:09
An alle, die mir den Tipp geben haben, dass ich das Öffnen der Tabelle vor die Schleifen legen solle, ein herzlichen Dank.

Das hat 50% Zeit eingespart.

jetzt werde ich mir noch die anderen Vorschläge anschauen. Vielleicht geht es ja noch schneller und komme an die Zeit des BULK INSERT.

Vielen Dank nochmal für eure Hilfe.

gruß, Sven
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 12:46
CSV-Dateien kann man auch per ADO öffnen Hier im Forum suchenCSV
(ok, den Hinweis hatte ich dir schon gegeben ... scheint also wohl nicht interessant zu sein)

Der Insert geht wesentlich schneller mit einem "prepared" INSERT-Statement mit Parametern.
Weiterhin sollte man den kompletten INSERT innerhalb einer Transaktion durchführen.
Einige DBMS aktualisieren die Indizes nämlich erst nach Abschluss der Transaktion.

SQL-Code:
INSERT INTO tab ( fld1, fld2, fld3, fld4 )
VALUES ( :fld1, :fld2, :fld3, :fld4 )
PS: Nach meiner Erfahrung ist das Öffnen der gesamten Tabelle um dann mit Append und Post neue Datensätze einzufügen, die langsamste Variante, die man wählen kann
Um das Übertragen der bestehenden Datensätze zu verhindern, solltest du den SELECT wie folgt aufrufen:
SELECT * FROM fullload_data WHERE 1 = 0
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 1. Dez 2010 um 12:58 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 12:57
Die Klausel WHERE 0=1 verhindert, dass unnötigerweise Daten vom Server gelesen werden.
Delphi-Quellcode:
DSData.Close;
DSData.CommandText := 'Select * from fullload_data WHERE 0=1';
DSData.Open;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 12:59
Die Klausel WHERE 0=1 verhindert, dass unnötigerweise Daten vom Server gelesen werden.
Delphi-Quellcode:
DSData.Close;
DSData.CommandText := 'Select * from fullload_data WHERE 0=1';
DSData.Open;
Aber anscheinend steht er auf kompliziert, unflexibel und langsam
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Append Code optimieren aber was macht Sinn?

  Alt 1. Dez 2010, 13:26
Das mit den CSV Dateien hatte ich auch schon mal gemacht. War meine erste Lösung. Nun haben sich aber die Anforderungen geändert und die Daten müssen nun in eine MS SQL Datenbank, um komplexe Abfragen zu erstellen.

Wie müsste man das mit dem "prepared" INSERT-Statement mit Parametern machen. Mir fehlt gerade der Ansatz. Müsste ich dann TADOQuery oder TADOCommand benutzen?

Eins hatte ich noch vergessen. Meine Datenbanktabelle wird vor dem Import geleert mit. Also keine alten Daten vorhanden.
Delphi-Quellcode:
// TADOCommand Komponente
SQLCommand.CommandText := 'TRUNCATE TABLE fullload_data';
SQLCommand.Execute;
  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 11:24 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