Einzelnen Beitrag anzeigen

Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#1

Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 21:28
Datenbank: FireBird • Version: 2.0 • Zugriff über: IB
Huhu,
Ich habe die Aufgabe, das ich Datensätze von einer DB in eine ArchivDb zu kopieren.
Der Vorgang an sich ist kein Problem.mir geht es darum, wie kann ich mehr Geschwindigkeit rausholen?Ich mache Im moment ca 1000 Datensätze pro Sekunde. Nur das ist "einwenig" zu wenig, da muss mehr gehen.

Zum Datenbankaufbau:
Die Tabelle besteht aus ca 60 Feldern.
Einem PrimärIndex (Integer) 1 Feld
und einem UniqueIndex (Integer,Integer,Integer,Date,Time,Integer,Integer ) 7 Felder (Der Muss leider so lang sein
und einen FremdIndex (Integer) 1 Feld (ist zu Optimierung von Auswertungen)

Ich habe mir mal ein kleines Testpropgramm geschrieben was einfach mal 30K Datensätze erzeugt und einfügt.
Ich nutze zur Zeit die Standardkomps aus BDS 2006 Version: "InterbaseExpress 12,12"


Delphi-Quellcode:
    
for DS := 1 to 30000 do // Alle Datensätze Duchgehen
    Begin
      FeldListe := '';
      WertListe := '';
      INC(GesGearb);
      for Fld := 0 to q.Fields.Count -1 do // Alle Felder der Tabelle Durcharbeiten
      Begin
        FeldName := q.Fields[Fld].FieldName;

        if FeldListe <> 'then FeldListe := FeldListe + ',';
        if WertListe <> 'then WertListe := WertListe + ',';
        if ((FeldName = 'ZAEHLER') or (FeldName = 'LO'))
        then Wert := IntToStr(DS)
        else
        Begin
          case q.Fields[Fld].DataType of
          ftSmallint, ftInteger : Wert := IntToStr(123);
          ftFloat,FTBCD : Wert := '1.23';
          ftDate : Wert := #39 + DateToStr(NOW) + #39;
          ftTime : Wert := #39 + TimeToStr(NOW) + #39;
          ftDateTime : Wert := #39 + DateTimeToStr(NOW) + #39;
          else Wert := #39 + 'asd' + #39;
          end;
        end;
        FeldListe := FeldListe + FeldName;
        WertListe := WertListe + Wert;
      end;
      if sender = Button1 then
      Begin
        IBSQL1.Close;
        IBSQL1.SQL.text := 'Insert into tabelle ('+FeldListe+') values ('+WertListe+')';
        IBSQL1.ExecQuery;
        IBSQL1.Close;
      end;
      if CheckBox1.Checked then Application.ProcessMessages;
    end;
Für diese Schleife mit den 30K Datensätzen brauche ich ca 28-31 Secunden.
Nur die Datenbank in die Eingefügt wird ist absolut Leer. Sodas die Zeit in der Richtigen Datenbank deutlich langsamer sein wird.

Danke schonmal im Vorraus
mfg Jens
  Mit Zitat antworten Zitat