Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Parameter & Prepared (https://www.delphipraxis.net/183216-parameter-prepared.html)

Mavarik 20. Dez 2014 15:07

Datenbank: MySQL • Version: x • Zugriff über: Firedac

Parameter & Prepared
 
Hallo Zusammen!

Angeblich sollen ja Prepared-Statements schneller sein, als immer neu das Statement zu übergeben, Richtig?

Wenn ich mit Wireshark mit anschaue was zum MySQL-Server übertragen wird ist das immer das gleiche:

"SELECT * FROM MyTable where ID=1"
"SELECT * FROM MyTable where ID=2"
"SELECT * FROM MyTable where ID=3"
"SELECT * FROM MyTable where ID=4"

Egal ob ich
Delphi-Quellcode:
fdQuery1.SQL.Text := 'SELECT * FROM MyTable where ID=:ID'
fdQuery1.ParamByName('ID').Value := i;
oder

Delphi-Quellcode:
fdQuery1.SQL.Text := 'SELECT * FROM MyTable where ID='+inttostr(I);


Wo ist der Trick?

Mavarik

Bernhard Geyer 20. Dez 2014 15:17

AW: Parameter & Prepared
 
Der Trick liegt daran auch wirklich prepared Statements zu verwenden.
So wie du es getestet hast, hast du nur Parameter verwendet.


Delphi-Quellcode:
fdQuery1.SQL.Text := 'SELECT * FROM MyTable where ID=:ID'
fdQuery1.Prepare
...
fdQuery1.ParamByName('ID').Value := i;

Uwe Raabe 20. Dez 2014 15:19

AW: Parameter & Prepared
 
Nur zur Kontrolle: ResourceOptions.DirectExecute ist false?

Mavarik 20. Dez 2014 15:22

AW: Parameter & Prepared
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1284190)
Der Trick liegt daran auch wirklich prepared Statements zu verwenden.
So wie du es getestet hast, hast du nur Parameter verwendet.


Delphi-Quellcode:
fdQuery1.SQL.Text := 'SELECT * FROM MyTable where ID=:ID'
fdQuery1.Prepare
...
fdQuery1.ParamByName('ID').Value := i;

Hatte ich...

Mavarik 20. Dez 2014 15:23

AW: Parameter & Prepared
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1284191)
Nur zur Kontrolle: ResourceOptions.DirectExecute ist false?

Gute Frage was ist Default?

Hast Du vielleicht ein mini Beispiel?

Uwe Raabe 20. Dez 2014 15:40

AW: Parameter & Prepared
 
Zitat:

Zitat von Mavarik (Beitrag 1284193)
Zitat:

Zitat von Uwe Raabe (Beitrag 1284191)
Nur zur Kontrolle: ResourceOptions.DirectExecute ist false?

Gute Frage was ist Default?

Default ist schon false. Ich wollte das nur als mögliche Fehlerquelle ausschließen.

Dejan Vu 20. Dez 2014 15:55

AW: Parameter & Prepared
 
Wieso sollte dieses Pillepallestatement mit einem Prepare eigentlich schneller werden?
Wäre es denkbar, das der Prepare-Entscheid-O-Mat einfach meint: "Nö, also so nich?".

Versuchs doch mal mit einem Kombinierten SELECT mit JOIN und statischen WHERE, á la:
Code:
SELECT foo
  FROM Tabelle1 join Tabelle2 on ...
 where irgendwas and noch irgendwas
   and Foo = :Parameter
Ich denke, wenn da das Prepare nicht zuschlägt, weiß ich auch nicht.

Bernhard Geyer 20. Dez 2014 15:56

AW: Parameter & Prepared
 
Zitat:

Zitat von Mavarik (Beitrag 1284192)
Hatte ich...

Dann macht Firedac hier was falsch oder ein Property ist falsch gesetzt.

Letztendlich solltest du das sehen was bei Oracle für MySQL und Prepared Statements beschrieben ist:
http://dev.mysql.com/doc/refman/5.0/...tatements.html

Bernhard Geyer 20. Dez 2014 16:00

AW: Parameter & Prepared
 
Zitat:

Zitat von Dejan Vu (Beitrag 1284199)
Wieso sollte dieses Pillepallestatement mit einem Prepare eigentlich schneller werden?

Auch solche "Pillepallestatements" sind schneller. Ein paar weniger Bytes auf der Netzwerkstrecke, Keine Analyse des SQL-Statements, Kein Aufbau eines optimale Abfrage, ...

Zitat:

Zitat von Dejan Vu (Beitrag 1284199)
Wäre es denkbar, das der Prepare-Entscheid-O-Mat einfach meint: "Nö, also so nich?".

Bei einem Preparen darf hier keiner was entscheiden. Ich sage ihm "Prepare es". Und dann muss es prepared werden. Obwohl. MySQL gehört ja mittlerweile zu Oracle.
Und was für einen Mist wir mit Oracle schon erlebt haben ... (das ist aber andere Geschichte).

Zitat:

Zitat von Dejan Vu (Beitrag 1284199)
Versuchs doch mal mit einem Kombinierten SELECT mit JOIN und statischen WHERE, á la:

Ich denke das o.g. Beispiel ist nur ein Beispiel um zu verstehen wie Prepared Statements funktionieren.

Mavarik 20. Dez 2014 16:06

AW: Parameter & Prepared
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1284201)
Ich denke das o.g. Beispiel ist nur ein Beispiel um zu verstehen wie Prepared Statements funktionieren.

Logisch, ich bin aber davon ausgegangen, dass dann auch nur der Parameter neu übertragen wird...


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

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