AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Insert optimieren

Ein Thema von PhilmacFLy · begonnen am 16. Sep 2010 · letzter Beitrag vom 16. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#1

Insert optimieren

  Alt 16. Sep 2010, 11:27
Datenbank: Firebird • Version: 2.1 • Zugriff über: Zeos
Moin Dp
Ich hab folgendes Problem, ich hab hier ein Array mit 4*30000 Werten, und muss dass möglichst schnell in die Firebird Datenbank einspeisen. Momentan brauch ich für die 30k werte ungefähr 30 Sekunden (übers Netzwerk), und da dachte ich mir das kann man bestimmt noch optimieren, hier mal mein Code:

Delphi-Quellcode:
  Frm_Messung.ZConnection1.StartTransaction;
  with Frm_Messung.ZQuery2 do
    begin
      saving := true;
      for zt := 0 to round(Frm_Messung.Ch_Messung.BottomAxis.Maximum) do
        begin
          Params[0].AsInteger := tId;
          Params[1].AsInteger := zt;
          Params[2].AsFloat := arr_messwerte[tdim, zt, 0];
          Params[3].AsFloat := arr_messwerte[tdim, zt, 1];
          ExecSQL;
          frm_messung.pb_db.Position := frm_messung.pb_db.Position +1;
        end;
    end;
  (*try
  Frm_Messung.ZQuery2.ExecSQL;
  except
  Frm_Messung.ZConnection1.Rollback;
  end;*)

  Frm_Messung.ZConnection1.Commit;
Im Zquery2.Sql steht:
Code:
INSERT INTO Messwerte (ID_mess, Millisec, Messwert_Links, Messwert_Rechts, Winkel, Merker) VALUES (:id, :sec, :mel, :mer, :win, :mek);
wobei ich die Parameter alle im Query selber schon eingetragen hab.
Die Parameter win und mek sind noch nicht belegt kommt aber später noch.

Nun wäre halt die frage wo ich noch das eine oder andere Rädchen drehen könnte um das zu optimieren.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"

Geändert von mkinzler (16. Sep 2010 um 14:30 Uhr) Grund: Code-Tag durch Delphi-tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

AW: Insert optimieren

  Alt 16. Sep 2010, 11:53
Normalerweise muss man am Anfang ein Prepare aufrufen damit auch wirklich das prepared statement verwendet wird. Evtl. macht das ZEOS automatisch.

Sonst könntest du versuchen mehrer inserts in einem ExecSQL abschicken (BULK INSERT).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Insert optimieren

  Alt 16. Sep 2010, 12:00
Ich hab versucht erst nach dem for to das ExecSQL abzuschicken, dann wird _nur_ der letzte Wert eingetragen.

Wie ruf ich den das Prepare auf?
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Insert optimieren

  Alt 16. Sep 2010, 12:03
normalerweise gibts ein Property Prepared das du auf True setzt oder eine entsprechende Methode.
Aber ich weis nicht wie das Zeos bereit stellt.

Beim MS SQL Server würde ich sagen: Schau doch mal im Profiler nach was auf der DB ankommt.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Insert optimieren

  Alt 16. Sep 2010, 12:10
Also eine Option prepared hab ich nicht gefunden, weder in der Connection noch im query
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

AW: Insert optimieren

  Alt 16. Sep 2010, 12:19
Klappt denn dies?
Frm_Messung.ZQuery2.Prepare;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Insert optimieren

  Alt 16. Sep 2010, 12:22
Nein es kommt die typische Meldung, TZQuery enthält kein Element namens Prepare.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
shmia

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

AW: Insert optimieren

  Alt 16. Sep 2010, 14:21
Es gibt folgende "Tricks" für schnellere Masseninsert:
1.) INSERT-Anweisung mit mehreren Zeilen
SQL-Code:
INSERT INTO Tabelle(KFZ, leistung)
VALUES('BMW M3', 321.0)
VALUES('VW Golf5 TDI', 120.0)
VALUES('Audi A3 TDI', 120.0)
...
Somit kann man auf einen Rutsch einige Hundert bis Tausend Datensätze einfügen.
Der Vorteil ergibt sich auch dadurch, dass nicht jeder einzelne Datensatz
einen TCP/IP Roundtrip erfordert.
Leider verstehen nur wenige Datenbanken diese erweiterte Syntax.

2.) viele Insert-Anweisungen (getrennt durch auf einen Rutsch an den Server senden.
Dazu werden die Insert-Anweisung in einer Stringliste gesammelt
und als ein Gesamtstring an die ExecSQL() Funktion weitergegeben.
Auch hier hängt es davon ab, ob die Datenbank diesen "Batch-Betrieb" akzeptiert.

In beiden Fällen müssen die Insert-Anweisung ohne Unterstützung durch Parameter erzeugt werden.
Aber die höhere Einfügegeschw. sollte diesen Nachteil aufwiegen.
Andreas
  Mit Zitat antworten Zitat
exilant

Registriert seit: 28. Jul 2006
134 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Insert optimieren

  Alt 16. Sep 2010, 14:24
... Momentan brauch ich für die 30k werte ungefähr 30 Sekunden (übers Netzwerk), und da dachte ich mir das kann man bestimmt noch optimieren,
Nun, das sind immerhin 1.000 Inserts/Sek. An dem Code kannst Du IMO nichts optimieren. Transaktion starten - inserts - Commit/Rollback. Was anderes kannst Du da nicht machen.
Auf was für einer Maschine läuft der Firebird? Welche Auslastung erzeugt er bei den inserts? Welche Netzlast liegt vor? Hat die Tabelle Trigger und wenn ja was tun die? Hat die Tabelle Indexe und wenn ja wie komplex sind die? Falls der FB auf einer Windows Maschine läuft: Lasse den Job doch mal auf der gleichen Maschine laufen.
Anything, carried to the extreme, becomes insanity. (Exilant)
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Insert optimieren

  Alt 16. Sep 2010, 14:49
Also ich hab jetzt mal den Code so abgeändert:
Delphi-Quellcode:
 Frm_Messung.ZConnection1.StartTransaction;
  with Frm_Messung.ZQuery2 do
    begin
      saving := true;
      //list.Text := 'execute block as begin';
      for zt := 0 to round(Frm_Messung.Ch_Messung.BottomAxis.Maximum) do
        begin
          (*Params[0].AsInteger := tId;
          Params[1].AsInteger := zt;
          Params[2].AsFloat := arr_messwerte[tdim, zt, 0];
          Params[3].AsFloat := arr_messwerte[tdim, zt, 1];
          ExecSQL;*)

          list.Add('INSERT INTO Messwerte (ID_mess, Millisec, Messwert_Links, Messwert_Rechts) VALUES (' + InttoStr(tid) + ', ' + InttoStr(zt) +', ' + FloattoStr(arr_messwerte[tdim, zt, 0]) + ', '+ FloattoStr(arr_messwerte[tdim, zt, 1]) + ' );');
          frm_messung.pb_db.Position := frm_messung.pb_db.Position +1;
        end;
      //list.Add('end');
      SQL := list;
    end;
  try
  Frm_Messung.ZQuery2.ExecSQL;
  except
  Frm_Messung.ZConnection1.Rollback;
  end;
  Frm_Messung.ZConnection1.Commit;
Dann bekomm ich immer
Code:
Unknown Token in Line 2 Insert
@exilant
Der Firebird läuft auf einem WIN 2003 SBS, keine trigger keine indizes, und wenn ich die ganze Sache Embedded mach gehts etwas schneller so cs 15-20 sekunden für 30k

Edit:
Hab das grad gefunden
http://codicesoftware.blogspot.com/2...registers.html
der schafft in 19s 100k, aber ich versteh nicht ganz was er macht?
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"

Geändert von PhilmacFLy (16. Sep 2010 um 14:51 Uhr)
  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 21:43 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