Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL "Update or Insert" langsam (https://www.delphipraxis.net/191313-sql-update-insert-langsam.html)

BlueStarHH 2. Jan 2017 20:10

AW: SQL "Update or Insert" langsam
 
Zitat:

Zitat von hoika (Beitrag 1357820)
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?

hoika 2. Jan 2017 21:55

AW: SQL "Update or Insert" langsam
 
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?

Slipstream 3. Jan 2017 04:14

AW: SQL "Update or Insert" langsam
 
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;

hoika 3. Jan 2017 05:25

AW: SQL "Update or Insert" langsam
 
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.

p80286 3. Jan 2017 08:00

AW: SQL "Update or Insert" langsam
 
Zitat:

Zitat von BlueStarHH (Beitrag 1357828)

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

DeddyH 3. Jan 2017 08:12

AW: SQL "Update or Insert" langsam
 
2 PKs geht nicht, aber ein zusammengesetzter über 2 Felder schon ;)

jobo 3. Jan 2017 09:51

AW: SQL "Update or Insert" langsam
 
Zitat:

Zitat von p80286 (Beitrag 1357872)
Zitat:

Zitat von BlueStarHH (Beitrag 1357828)
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.

Zitat:

Zitat von DeddyH (Beitrag 1357873)
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..

user0815 3. Jan 2017 10:14

AW: SQL "Update or Insert" langsam
 
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;

bnreimer42 3. Jan 2017 14:46

AW: SQL "Update or Insert" langsam
 
Da kapselt dann aber IBDAC die Batch-Operation.
Das gibt es bei Firebird keine direkte Unterstützung in der API.

Gruß

Björn

jobo 3. Jan 2017 19:40

AW: SQL "Update or Insert" langsam
 
Zitat:

Zitat von bnreimer42 (Beitrag 1357944)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 Uhr.
Seite 2 von 3     12 3      

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