Leistung des Array DML-Befehls (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Anweisungen (FireDAC)


In diesem Artikel wird die Leistung des von FireDAC unterstützten Array DML-Features beschrieben. In diesem ersten Artikel wird ein einfaches Beispiel beschrieben, das zeigt, wie Tausende von Datensätzen pro Sekunde über nur ein paar wenige Codezeilen eingefügt werden können.

Einführung

FireDAC kapselt alle datenbankserverspezifischen Implementierungen der Array DML-Befehle und ermöglicht die Verwendung von identischem Code für alle Servertypen. Die resultierende Leistung unterscheidet sich hinsichtlich der Serverimplementierung. Hauptsächlich Oracle, Microsoft SQL Server und IBM DB2 verfügen über eine leistungsstarke Unterstützung von Array DML, und die resultierende Leistung wird wesentlich erhöht.

Verwenden Sie den Beispielcode, um ein Gefühl der möglichen Leistungssteigerung Ihrer Anwendung und des Netzwerks zu erhalten.

Vorbereiten der Testumgebung

Das folgende Beispiel arbeitet mit der Beispieldatenbankumgebung von FireDAC. Weitere Einzelheiten über die Installation dieser Datenbank finden Sie unter FireDAC-Demodatenbanken. Die Demoprojekte befinden sich in Ihrem Beispielverzeichnis:

  • Der in diesem Tutorial verwendete Code: FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\AD03-ArrayDML.
  • Ein grundlegendes Codebeispiel: FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\Batch.

Hauptelemente der Array DML-Befehle

Stellen Sie sich einen "Anwendungsfall" vor, in dem die Anweisungen INSERT, UPDATE, DELETE oder andere parametrisierte Anweisungen n-mal ausgeführt werden müssen, in der Regel eine Anweisung pro Datensatz. Das bedeutet, dass jede Gruppe von Eingabeparametern die Ausführung einer SQL-Anweisung anfordert und separat zwischen dem Client und dem Server übertragen wird, was zu einer hohen Auslastung von Netzwerk, Client und Server führt.

Array DML ermöglicht den Transport nicht nur einer sondern n Gruppen von Daten in einer Übertragung. Siehe das folgende Beispiel:

FDQuery1.SQL.Text:= 'insert into ADQA_Batch_test (tint, tstring) values(:f1, :f2)';

Sie können Ihren Code mit Array DML-Befehlen wesentlich beschleunigen. Solche Befehle übertragen nicht nur eine, sondern n Gruppen von Parametern.

FDQuery1.Params.ArraySize := 100;
...
for i := 0 to FDQuery1.Params.ArraySize do begin
  FDQuery1.Params[0].AsIntegers[i] := i;
  FDQuery1.Params[1].AsStrings[i] := 'Test' + IntToStr(i);
end;
FDQuery1.Execute(FDQuery1.Params.ArraySize);

Die Eigenschaft Params der Abfrage ist nicht mehr ein eindimensionales-, sondern ein zweidimensionales Array, das das Speichern von n Gruppen von Parameterwerten vor dem Senden zum Server ermöglicht.

Weitere Details finden Sie im Referenzkapitel Array DML.

Hinweise zur Verwendung

  • Kann für alle SQL-Anweisungen verwendet werden, die Parameter verwenden (INSERT, UPDATE, DELETE ...).
  • Die Fehlerbehandlung wird auf Datensatzebene unterstützt und in einem eigenen Artikel beschrieben.
  • FireDAC vereinheitlicht die Array DML für unterschiedliche Servertypen (Sie brauchen sich nicht mit der API zu befassen).

Typische Ergebnisse des Array DML-Testlaufs

Der beigefügte Testcode ermöglicht Ihnen, mit Ihrer speziellen Umgebung zu experimentieren.

ArrayDMLTestPicture.png

Die Ergebnisse des Testbeispiels können abhängig von Host- und Netzwerkleistung erheblich variieren. Ein typisches Bild einer lokalen Oracle-Datenbank auf einem ziemlich alten Laptop zeigt dennoch mehr als 100.000 Datensätze pro Sekunde, wie in diesem Screenshot gezeigt:

ArrayDMLTestResults.png

Ein größeres Array von Array DML führt zu einer höheren Leistung (in diesem Fall bis zu einem Faktor von 2.000).

AD03 Results.png

Hinweise zur Leistung

Die Leistung von Array DML-Befehlen wird durch Folgendes beeinflusst:

  • Sie sind wesentlich schneller in langsamen Netzwerken, da diese Befehle weniger TCP/IP-Packages erstellen.
  • Sie reduzieren die CPU-Belastung auf der Client-Seite, da der Server meistens mit dem Array-Befehl arbeiten muss.
  • Die theoretische Geschwindigkeit von mehr als 100.000 Datensätzen pro Sekunde wird nicht häufig erreicht, da der Server normalerweise Trigger und Indizes auswerten muss.
  • Bei sehr großen Stapeleinfügungen (z. B. mehr als 1.000.000 Datensätze) sollten Sie in Betracht ziehen, Nicht-Primärschlüsselindizes zu erstellen, um die maximale Leistung zu erzielen.


Siehe auch