![]() |
AW: SQL "Update or Insert" langsam
Zitat:
B VarChar(50) PK C Blob Text 80 Muss ich das SQL also anpassen? |
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? |
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; |
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. |
AW: SQL "Update or Insert" langsam
Zitat:
Da bin ich auf den ersten Ärger mit Umlauten und/oder Codepages gespannt. Gruß K-H |
AW: SQL "Update or Insert" langsam
2 PKs geht nicht, aber ein zusammengesetzter über 2 Felder schon ;)
|
AW: SQL "Update or Insert" langsam
Zitat:
Zitat:
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.. |
AW: SQL "Update or Insert" langsam
Zugriff erfolgt über: IBDAC
kurz mal geguckt: ![]() 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; |
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 |
AW: SQL "Update or Insert" langsam
Zitat:
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 14:31 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