AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Effiziente SELECT Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Effiziente SELECT Abfrage

Ein Thema von WorstNightmare · begonnen am 29. Jul 2009 · letzter Beitrag vom 30. Jul 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#11

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 12:01
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
Und so stelle ich nun Stück für Stück den gesamten Code auf Parameter um.
Jens
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 19:25
Zitat von DeddyH:
Mit Parametern wär's noch besser
Es ging um die SQL-Syntax.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 19:26
Zitat von alzaimar:
Zitat von DeddyH:
Mit Parametern wär's noch besser
Es ging um die SQL-Syntax.
Und um Effektivität.
Markus Kinzler
  Mit Zitat antworten Zitat
pertzschc

Registriert seit: 29. Jul 2005
Ort: Leipzig
309 Beiträge
 
Delphi 12 Athens
 
#14

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 19:35
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 19:37
Ja, da bei prepared Statement zu einem nur die Parameter übertragen werden und zudem das Parsen, Planbilden usw. entfällt
Markus Kinzler
  Mit Zitat antworten Zitat
pertzschc

Registriert seit: 29. Jul 2005
Ort: Leipzig
309 Beiträge
 
Delphi 12 Athens
 
#16

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 19:47
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
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 20:00
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?
Ansgar Becker
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 20:03
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
Markus Kinzler
  Mit Zitat antworten Zitat
Frederika

Registriert seit: 28. Jan 2009
81 Beiträge
 
#19

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 22:40
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!
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Effiziente SELECT Abfrage

  Alt 29. Jul 2009, 22:57
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).
Ansgar Becker
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 04:55 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