Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Effiziente SELECT Abfrage (https://www.delphipraxis.net/137795-effiziente-select-abfrage.html)

Nersgatt 29. Jul 2009 11:01

Re: Effiziente SELECT Abfrage
 
Ein sehr sinnvolles Vorhaben.
Ich habe eine Anwendung übernommen, wo überhaupt nicht mit Parametern gearbeitet wurde. Insbesondere bei Schnittstellen, wo 1000x ein Insert ausgeführt wird, habe ich festgestellt, dass es nach umstellung auf Parameter um den Faktor 3 schneller lief. Da haben einige Leute erstaunt geschaut :mrgreen:
Und so stelle ich nun Stück für Stück den gesamten Code auf Parameter um.

alzaimar 29. Jul 2009 18:25

Re: Effiziente SELECT Abfrage
 
Zitat:

Zitat von DeddyH
Mit Parametern wär's noch besser :zwinker:

Es ging um die SQL-Syntax. :cheer:

mkinzler 29. Jul 2009 18:26

Re: Effiziente SELECT Abfrage
 
Zitat:

Zitat von alzaimar
Zitat:

Zitat von DeddyH
Mit Parametern wär's noch besser :zwinker:

Es ging um die SQL-Syntax. :cheer:

Und um Effektivität. :zwinker:

pertzschc 29. Jul 2009 18:35

Re: Effiziente SELECT Abfrage
 
Zitat:

Zitat von Nersgatt
Insbesondere bei Schnittstellen, wo 1000x ein Insert ausgeführt wird, habe ich festgestellt, dass es nach umstellung auf Parameter um den Faktor 3 schneller lief.

Nun hätte ich die Frage, ob das auch bei Verwendung von ADO-Klasse mit MS SQL Server so ist, dass es mit Parametern schneller wird?

Danke,
Christoph

mkinzler 29. Jul 2009 18:37

Re: Effiziente SELECT Abfrage
 
Ja, da bei prepared Statement zu einem nur die Parameter übertragen werden und zudem das Parsen, Planbilden usw. entfällt

pertzschc 29. Jul 2009 18:47

Re: Effiziente SELECT Abfrage
 
Zitat:

Zitat von mkinzler
Ja, da bei prepared Statement zu einem nur die Parameter übertragen werden und zudem das Parsen, Planbilden usw. entfällt

Wie sollte man dann folgenden Code am besten umbauen (Beispiel eines Insert-Statement)? Bisher haben wir das SQL Statement komplett übergeben und ausserhalb dieser Funktion als String zusammengesetzt:
Delphi-Quellcode:
function TmyADOFunctions.ADOInsertIntoDB(a_SQLStatement: string): TMyADOResultStruct;
var
  myADOResultStruct          : TMyADOResultStruct;
  lCounter                   : integer;
begin
  assert(true = Prod_Conn_CorrectConnected);
  myADOResultStruct := TMyADOResultStruct.Create; // init

  try
    ADOCommand1.Connection.BeginTrans;
    ADOCommand1.CommandType := cmdText;
    ADOCommand1.CommandText := a_SQLStatement;
    ADOCommand1.Connection.Execute(a_SQLStatement, lCounter);
    myADOResultStruct.counter := lCounter;
    ADOCommand1.Connection.CommitTrans;
    myADOResultStruct.status := true;

  except
    // wenn Fehler abbrechen...
    on E: Exception do begin
      ADOCommand1.Connection.RollbackTrans;
      myADOResultStruct.status := false;
      myADOResultStruct.exception := E;
      myADOResultStruct.exceptionTxt := E.Message;
    end;
  end; // try-except
  Result := myADOResultStruct;
end;
Danke+Gruß,
Christoph

anse 29. Jul 2009 19:00

Re: Effiziente SELECT Abfrage
 
Parameter zu verwenden bedeutet aber nicht sofort daß es zu einem prepared Statement wird - das muß die Datenbank-API erstmal unterstützen und dann heißt es doch eher Query.ExecPrepared oder nich?

mkinzler 29. Jul 2009 19:03

Re: Effiziente SELECT Abfrage
 
Einmalig ( beim Ersten Insert oder bei Programmstart) Statement setzen und preparieren.
Beim Insert dann nur noch Parameter setzen.

Zitat:

Parameter zu verwenden bedeutet aber nicht sofort daß es zu einem prepared Statement wird - das muß die Datenbank-API erstmal unterstützen
Das habe ich mal bei MSSQL voausgesetzt
Zitat:

und dann heißt es doch eher Query.ExecPrepared oder nich?
Kommt auf DBMS/Komponenten an

Frederika 29. Jul 2009 21:40

Re: Effiziente SELECT Abfrage
 
Zitat:

Zitat von mkinzler
Einmalig ( beim Ersten Insert oder bei Programmstart) Statement setzen und preparieren.
Beim Insert dann nur noch Parameter setzen.

Was für ein genialer Tipp. Da hätte man selbst drauf kommen sollen... Das hat bei ADO eben gerade super funktioniert. CommandText nur einmal mit INSERT-Statement belegen, in der Schleife nur noch Parameters ändern hat Faktor 2x gebracht. Dann noch Prepared := True nochmal Faktor 2x -- insgesamt etwa Faktor 3.8 reproduzierbar schneller als mit der langweiligen Nichtwisser-Version, die ich vorher hatte.

Danke!

anse 29. Jul 2009 21:57

Re: Effiziente SELECT Abfrage
 
Einen Faktor 100 bekommst du wenn du die extended Syntax für INSERTs benutzt (die soweit ich weiß nur von MySQL unterstützt wird):

Code:
INSERT INTO `mytable` (`col1`, `col2`, `col3`)
  VALUES (1, 'bla', 'foo'),
    (2, 'bla', 'foo'),
    (3, 'bla', 'foo'),
    (4, 'bla', 'foo'),
    (5, 'bla', 'foo'),
    ...
    (1000, 'bla', 'foo')
Du bastelst also einen riesigen SQL String zusammen und fügst damit tonnenweise Zeilen mit einem einzigen Befehl in die Tabelle. Ist limitiert auf die max_allowed_packet Einstellung (per Default auf 1M).


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

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