![]() |
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:
oder
fdQuery1.SQL.Text := 'SELECT * FROM MyTable where ID=:ID'
fdQuery1.ParamByName('ID').Value := i;
Delphi-Quellcode:
fdQuery1.SQL.Text := 'SELECT * FROM MyTable where ID='+inttostr(I);
Wo ist der Trick? Mavarik |
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; |
AW: Parameter & Prepared
Nur zur Kontrolle: ResourceOptions.DirectExecute ist false?
|
AW: Parameter & Prepared
Zitat:
|
AW: Parameter & Prepared
Zitat:
Hast Du vielleicht ein mini Beispiel? |
AW: Parameter & Prepared
Zitat:
|
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:
Ich denke, wenn da das Prepare nicht zuschlägt, weiß ich auch nicht.
SELECT foo
FROM Tabelle1 join Tabelle2 on ... where irgendwas and noch irgendwas and Foo = :Parameter |
AW: Parameter & Prepared
Zitat:
Letztendlich solltest du das sehen was bei Oracle für MySQL und Prepared Statements beschrieben ist: ![]() |
AW: Parameter & Prepared
Zitat:
Zitat:
Und was für einen Mist wir mit Oracle schon erlebt haben ... (das ist aber andere Geschichte). Zitat:
|
AW: Parameter & Prepared
Zitat:
|
AW: Parameter & Prepared
War ja nur ne Idee. Mal sehen, woran es liegt.
|
AW: Parameter & Prepared
Hmmm
Meine Frage wäre, ob FD tatsächlich die MySQL-Prepared-stmt API nutzt oder nicht: ![]() Die API ist buggy seit v4.1! Des weiteren bietet MySql keine API die Parameter und deren Eigenschaften "sicher" zu hinterfragen: ![]() Die Funktion existiert auch schon ewig und tut nix, rein gar gar nix! Wir bei Zeos haben den Support drin, meine Benchmarks mit dem "real"-prepared Sch.. sind ehrlich gesagt ernüchternd ausgefallen, da bei Parameter-Typ oder Größen-Änderungen immer wieder neue bind+ReAllocMem(wenn der parameter mehr Speicher braucht) notwendig sind. Tatsächlich ist MySQL so 'ne kleine Ausnahme und wirklich Höllen schnell, was das Parsen der Strings und "escapen" angeht. Der Weg rückwärts als fetch fällt da genauso schlimm aus. Die C-API bietet ResultSets ebenfalls an. Der Performance-Drop ist wirklich übel auch das Speicher handling für Lob's. Hat jemand eine Ahnung in welcher Art MySQL seine Daten ablegt? String oder Binär (e.g. Ordinals, Floats etc.)? Und weil wir schon dabei sind: PG bietet seit v8.0 auch ein binär Protokol, doch wie legt PG seine Daten ab? Könnte da was zu holen sein? Fürchte 'ne menge Zeit für die gleiche Pusteblume zu investieren... Ist eigentlich 'ne dumme Frage, aber Zahlen Lügen halt nicht! Ich kanns mir nicht anders erklären.. Bei PG würde es mich nicht mal wundern, wenn die unendliches String-Parsing innerhalb der Tabellen betreiben. By default nutzt Zeos die Emulierung der Parameter und bis heute ist diese schneller (wenn man alles drauf trimmt, mal vom Delphi-Unicode-Gedöhns abstand hält und ein paar schneller RTL-Replacements einbaut), und wie voran geführt: sicherer. Michael Ahh noch etwas, bevor ich korregiert werde (worauf Bernhard verweist) diese "Prepare xxxx" etc. Syntax hatte ich auch schon durch gespielt. Vielleicht habe ich mich da zu dumm angestellt, doch meine Messungen, aufgrund der vielen call's, fiehlen noch negativer aus... Somit würde ich mich im Fall MySQL Mavarik anschließen und einfach mal alles in Frage stellen (wenn FD auch emuliert, natürlich und keine "strings" escaped werden müssen)! :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 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