AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL "Update or Insert" langsam

SQL "Update or Insert" langsam

Ein Thema von BlueStarHH · begonnen am 2. Jan 2017 · letzter Beitrag vom 4. Jan 2017
Antwort Antwort
Seite 2 von 3     12 3   
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
797 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 21:10
und dem link von sproske zufolge spielt auch der primary key eine rolle,
wie sieht denn die tabellenstruktur aus?
A VarChar(50) PK
B VarChar(50) PK
C Blob Text 80

Muss ich das SQL also anpassen?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 22:55
Hallo,
das heisst also, dass der PK aus 2 Feldern (A,B) besteht,
dann ist das ja OK.

Wies sieht es mit "meinem" Prepare aus?
Heiko
  Mit Zitat antworten Zitat
Slipstream
(Gast)

n/a Beiträge
 
#13

AW: SQL "Update or Insert" langsam

  Alt 3. Jan 2017, 05:14
Kann man nicht einfach ein paar hundert oder sogar tausend Update-Insert-Anweisungen in einem Rutsch sammeln und die dann auf einmal executen? Wenn ich so grosse Mengen auf einmal aktualisieren und/oder einfügen muss, geht das immer viel schneller. Man kann doch in die SQL-Stringlisten einen Haufen Zeugs reinpacken, eigentlich bis der Speicher voll ist. Was da so aufhält, ist bestimmt das Execute 2000 Mal ausführen. Eigentlich sollte es auch reichen, das nur einmal auszuführen, 2000 Datensätze ist jetzt nicht die Welt.
Delphi-Quellcode:
Transaction.StartTransaction;

for i := 0 to 2000 do
begin
  Query.SQL[i] := 'Update or insert into foo (A, B, C) values (:a, :b, :c)';
  Query.ParamByName('a').AsString := 'v1';
  Query.ParamByName('b').AsString := 'v2';
  Query.ParamByName('c').AsString := 'v3';
end;

Query.Execute;

Transaction.Commit;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: SQL "Update or Insert" langsam

  Alt 3. Jan 2017, 06:25
Hallo,
FB kann kein bulk insert.
Hier könnte man sich mit external tables behelfen.
Aber ich wäre ja noch auf eine Antwort zu meinem prepare.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#15

AW: SQL "Update or Insert" langsam

  Alt 3. Jan 2017, 09:00

A VarChar(50) PK
B VarChar(50) PK
C Blob Text 80

Muss ich das SQL also anpassen?
Zwei Primary Keys? und dann augenscheinlich Text?
Da bin ich auf den ersten Ärger mit Umlauten und/oder Codepages gespannt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: SQL "Update or Insert" langsam

  Alt 3. Jan 2017, 09:12
2 PKs geht nicht, aber ein zusammengesetzter über 2 Felder schon
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
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#17

AW: SQL "Update or Insert" langsam

  Alt 3. Jan 2017, 10:51
A VarChar(50) PK
B VarChar(50) PK
C Blob Text 80
Zwei Primary Keys? und dann augenscheinlich Text?
Da bin ich auf den ersten Ärger mit Umlauten und/oder Codepages gespannt.
2 PKs geht nicht, aber ein zusammengesetzter über 2 Felder schon
Ja, ein Schlüssel kann aus mehreren Feldern bestehen.
Am interessantesten finde ich aber ein BLOB Text(80), der in das "Upsert" involviert ist.
Wie sieht es da mit Indizierung aus? Und wenn vorhanden, greift sie?

Wenn nicht, was ich mir ganz gut vorstellen kann, bedeutet jedes einzelne "Upsert" ein Fullscan. Das dann in einer Schleife und die Performance ist im A..
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#18

AW: SQL "Update or Insert" langsam

  Alt 3. Jan 2017, 11:14
Zugriff erfolgt über: IBDAC
kurz mal geguckt: https://www.devart.com/ibdac/docs/?batchops.htm

Batch INSERT operation sample
Let’s try to insert 1000 rows to the BATCH_TEST table using a Batch Insert operation:

Delphi-Quellcode:
var
  i: Integer;
begin
  // describe the SQL query
  IBCQuery1.SQL.Text := 'INSERT INTO BATCH_TEST VALUES (:ID, :F_INTEGER, :F_FLOAT, :F_STRING, :F_DATE)';

  // define the parameter types passed to the query :
  IBCQuery1.Params[0].DataType := ftInteger;
  IBCQuery1.Params[1].DataType := ftInteger;
  IBCQuery1.Params[2].DataType := ftFloat;
  IBCQuery1.Params[3].DataType := ftString;
  IBCQuery1.Params[4].DataType := ftDateTime;

  // specify the array dimension:
  IBCQuery1.Params.ValueCount := 1000;

  // populate the array with parameter values:
  for i := 0 to IBCQuery1.Params.ValueCount - 1 do
  begin
    IBCQuery1.Params[0][i].AsInteger := i + 1;
    IBCQuery1.Params[1][i].AsInteger := i + 2000 + 1;
    IBCQuery1.Params[2][i].AsFloat := (i + 1) / 12;
    IBCQuery1.Params[3][i].AsString := 'Values ' + IntToStr(i + 1);
    IBCQuery1.Params[4][i].AsDateTime := Now;
  end;

  // insert 1000 rows into the BATCH_TEST table
  IBCQuery1.Execute(1000);
end;
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
122 Beiträge
 
Delphi 12 Athens
 
#19

AW: SQL "Update or Insert" langsam

  Alt 3. Jan 2017, 15:46
Da kapselt dann aber IBDAC die Batch-Operation.
Das gibt es bei Firebird keine direkte Unterstützung in der API.

Gruß

Björn
Björn Reimer
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#20

AW: SQL "Update or Insert" langsam

  Alt 3. Jan 2017, 20:40
Da kapselt dann aber IBDAC die Batch-Operation.
Das gibt es bei Firebird keine direkte Unterstützung in der API.
Meinst Du eine Batchkomponente?
Mittels Transaktionshandling sollte es eigentlich wurscht sein, was an Spezialitäten da ist.
Wenn man eine Reihe von Befehlen absetzt, werden sie erst mit "Commit" commited.
Viele Commits, nach jedem insert bspw, bringen auch eine Verzögerung. Blockweise commit sind schneller, ist aber glaub ich marginal.
Gruß, Jo
  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 09:23 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