AGB  ·  Datenschutz  ·  Impressum  







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

SQL "Update or Insert" langsam

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

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#1

SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 13:06
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Hallo,

ich führe ca. 2000 "Update or Insert"-Statements mit einem TIBCQuery aus. Das dauert ca. 2,5 Sekunden und ist zu langsam. Ist das normal, dass das so lange dauert oder kann man das beschleuningen? (Zum Vergleich: Wenn ich die selben Daten ohne Datenbank in eine Ini-Datei schreibe ist das in 0,5 Sekunden erledigt.)

Code:
Transaction.StartTransaction;

for i := 0 to 2000 do
begin
  Query.SQL.Text := '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';
  Query.Execute;
end;

Transaction.Commit;

Geändert von BlueStarHH ( 2. Jan 2017 um 13:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 13:12
Wieso setzt Du innerhalb der Schleife jedesmal die SQL-Eigenschaft neu? Und fehlt da nicht ein MATCHING in Deinem Statement?
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
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 13:17
Und fehlt da nicht ein MATCHING in Deinem Statement?
Nicht zwangsläufig: In the absence of a MATCHING clause, matching is done against the primary key.

Siehe https://firebirdsql.org/refdocs/lang...or-insert.html
Sebastian
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 13:25
Wieso setzt Du innerhalb der Schleife jedesmal die SQL-Eigenschaft neu? Und fehlt da nicht ein MATCHING in Deinem Statement?
Pseudocode Die Schleife und der Inhalt sind im echten Code ganz weit von einander weg und entkoppelt, dass es nur so geht. Ich kann nur den Inhalt in der Schleife kontrollieren. Ob da nun eine String-Eigenschaft (SQL.Text) mehrfach gesetzt wird oder nicht sollte von der Geschwindgkeit unter den Tisch fallen...
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 13:27
Durch die dauernde Zuweisung des Statemants wird die Komponente jedes mal ein Unprepare schicken.
Dadurch geht der Vorteil der Parameter natürlich flöten...

Frank
Frank Reim
  Mit Zitat antworten Zitat
jobo

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

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 13:47
Ggf im SQL das Matching oder andere "Hilfsmittel" ergänzen. Auch wenn es dann doppeltgemoppelt ist, könnte es dem Optimizer eine Hilfestellung sein.
Ohne weiteres wirkt ja ein Update erstmal auf den gesamten Datenbestand, ist also eine fette Nummer.
Wirklich flott ist wahrscheinlich eine komplette Umstellung auf:
Step1:
Insert into <table> (<fields>)
select <values> from table
where not exists .. (bzw. in richtig mit self join und is null Prüfung)
Step2:
Updates mit ähnlichem Vorgehen.

Wäre die Frage, ob es ständig geschieht und nervt oder die bequeme Formulierung oben eine einmalige Sache ist und mit ein paar Tränchen verdrücken zu bewältigen ist.
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 14:07
Wieso setzt Du innerhalb der Schleife jedesmal die SQL-Eigenschaft neu? Und fehlt da nicht ein MATCHING in Deinem Statement?
Pseudocode Die Schleife und der Inhalt sind im echten Code ganz weit von einander weg und entkoppelt, dass es nur so geht. Ich kann nur den Inhalt in der Schleife kontrollieren. Ob da nun eine String-Eigenschaft (SQL.Text) mehrfach gesetzt wird oder nicht sollte von der Geschwindgkeit unter den Tisch fallen...
Nein. Absolut nicht, weil man dann den Vorteil der Parameter nicht hat

Delphi-Quellcode:
Transaction.StartTransaction;

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

Transaction.Commit;
Markus Kinzler
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#8

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 14:58
Delphi-Quellcode:
Transaction.StartTransaction;

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

Transaction.Commit;
Noch ein Vorschlag zur Beschleunigung:
Delphi-Quellcode:
Transaction.StartTransaction;

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

Transaction.Commit;
Erspart auch noch dreimal pro Runde das Auswerten von ParamByName.
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

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

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 15:39
Delphi-Quellcode:
Transaction.StartTransaction;

Query.SQL.Text := 'Update or insert into foo (A, B, C) values (:a, :b, :c)';

Query.Params[0].DataType := ftString;
Query.Params[1].DataType := ftString;
Query.Params[2].DataType := ftString;

for i := 0 to 2000 do
begin
  Query.Params[0].Value := 'v1';
  Query.Params[1].Value := 'v2';
  Query.Params[2].Value := 'v3';
  Query.Execute;
end;

Transaction.Commit;
geht es nicht auch so?
Erspart das Auswerten & Überprüfen des Typs sowie das Suchen der Parameter Position.
  Mit Zitat antworten Zitat
hoika

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

AW: SQL "Update or Insert" langsam

  Alt 2. Jan 2017, 20:43
Hallo,
bei IBDAC muss man explizit preparen, um Parameter ausnutzen zu können

Delphi-Quellcode:
Transaction.StartTransaction;

Query.SQL.Text := 'Update or insert into foo (A, B, C) values (:a, :b, :c)';

// das fehlte
Query.Prepare;

for i := 0 to 2000 do
begin
  Query.ParamByName('a').AsString := 'v1';
  Query.ParamByName('b').AsString := 'v2';
  Query.ParamByName('c').AsString := 'v3';
  Query.Execute;
end;

Transaction.Commit;
Und dem Link von SProske zufolge spielt auch der Primary Key eine Rolle,
wie sieht denn die Tabellenstruktur aus?
Heiko

Geändert von hoika ( 2. Jan 2017 um 20:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 15:47 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