AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Hilfe bei Optimierung in SQL

Hilfe bei Optimierung in SQL

Ein Thema von Pro_RJ · begonnen am 9. Okt 2008 · letzter Beitrag vom 13. Okt 2008
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Pro_RJ

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

Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22: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
Pro_RJ

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

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22:44
PS: Ich habe es gerade auchmal TIBScript getestet also alle 30K Insert-Statements auf einmal absetzte. DIeser VOrgang ist ca 20%-2525% langsamer
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.850 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22:46
Die Feldliste sollte für jeden DS gleich sein, es reicht deshalb sie einmalig zu bilden
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

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

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22:47
Jup ist sie auch, nur ich muss ja eh alle Felder durcharbeiten,um die Feldwerte zu ermitteln.
PS: das Spart ca 0,05 Secunden
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.850 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22:49
Aber nicht bei jedem Datensatz
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

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

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22:52
ne Insgesamt
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.850 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22:53
Du bildest diese bei 30 datensätze 30000mal, also 29999 unötige mal!!!
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

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

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22:57
ich habs mal umgebaut:
if CheckBox2.Checked
dann FeldListe einmal aufbauen
else Immer neu Bilden


Delphi-Quellcode:
    
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;
Ergebniss:
Feldliste immer aufbauen : 00:30:953
FeldListe einmal aufbauen : 00:30:325
Durchschnitt bei ca 10 Durchläufen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.850 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 22:59
Und wenn du die Bildung vor die Schleife ziehst?
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

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

Re: Hilfe bei Optimierung in SQL

  Alt 9. Okt 2008, 23:01
Die Feldliste wird vor der Eigentlichen Schleiche gebildet also nu ein mal. oder wie meinst du das?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:59 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