![]() |
Datenbank: FireBird • Version: 2.0 • Zugriff über: IB
Hilfe bei Optimierung in SQL
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:
Für diese Schleife mit den 30K Datensätzen brauche ich ca 28-31 Secunden.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; 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 |
Re: Hilfe bei Optimierung in SQL
PS: Ich habe es gerade auchmal TIBScript getestet also alle 30K Insert-Statements auf einmal absetzte. DIeser VOrgang ist ca 20%-2525% langsamer :-(
|
Re: Hilfe bei Optimierung in SQL
Die Feldliste sollte für jeden DS gleich sein, es reicht deshalb sie einmalig zu bilden
|
Re: Hilfe bei Optimierung in SQL
Jup ist sie auch, nur ich muss ja eh alle Felder durcharbeiten,um die Feldwerte zu ermitteln.
PS: das Spart ca 0,05 Secunden |
Re: Hilfe bei Optimierung in SQL
Aber nicht bei jedem Datensatz
|
Re: Hilfe bei Optimierung in SQL
ne Insgesamt
|
Re: Hilfe bei Optimierung in SQL
Du bildest diese bei 30 datensätze 30000mal, also 29999 unötige mal!!!
|
Re: Hilfe bei Optimierung in SQL
ich habs mal umgebaut:
if CheckBox2.Checked dann FeldListe einmal aufbauen else Immer neu Bilden
Delphi-Quellcode:
Ergebniss:if CheckBox2.Checked then Begin for Fld := 0 to q.Fields.Count -1 do Begin if Fld > 0 then FeldListe := FeldListe + ','; FeldListe := FeldListe + q.Fields[Fld].FieldName; end; end; for DS := 1 to 30000 do Begin if not CheckBox2.Checked then FeldListe := ''; WertListe := ''; INC(GesGearb); for Fld := 0 to q.Fields.Count -1 do Begin FeldName := q.Fields[Fld].FieldName; if not CheckBox2.Checked then 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; if not CheckBox2.Checked then FeldListe := FeldListe + FeldName; WertListe := WertListe + Wert; end; Feldliste immer aufbauen : 00:30:953 FeldListe einmal aufbauen : 00:30:325 Durchschnitt bei ca 10 Durchläufen |
Re: Hilfe bei Optimierung in SQL
Und wenn du die Bildung vor die Schleife ziehst?
|
Re: Hilfe bei Optimierung in SQL
Die Feldliste wird vor der Eigentlichen Schleiche gebildet also nu ein mal. oder wie meinst du das?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz