Performances de la commande Array DML (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des commandes (FireDAC)


Cet article décrit les performances élevées de la fonctionnalité Array DML supportée par FireDAC. Ce premier article présente un exemple facile d'insertion de milliers d'enregistrements par seconde en écrivant seulement quelques lignes de code.

Introduction

FireDAC encapsule l'implémentation des commandes Array DML spécifiques au serveur de base de données et vous permet d'utiliser un code identique pour tous les types de serveurs. Les performances obtenues diffèrent en fonction de l'implémentation du serveur. Oracle, Microsoft SQL Server et IBM DB2 supportent particulièrement bien la commande Array DML. L'augmentation des performances obtenues est d'ailleurs sensible.

Nous vous recommandons d'utiliser l'exemple de code pour évaluer l'augmentation potentielle de performance de votre application et de votre réseau.

Préparation de votre environnement de test

L'exemple suivant fonctionne avec l'environnement de base de données exemple de FireDAC. Pour de plus amples informations concernant l'installation de cette base de données, lisez la rubrique consacrée aux bases de données démo de FireDAC. Vous pouvez trouver des projets démo dans votre répertoire d'exemples :

  • Le code utilisé dans ce tutoriel : FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\AD03-ArrayDML.
  • Un exemple de code basique : FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\Batch.

Principaux éléments des commandes Array DML

Imaginons le "cas d'utilisation" suivant : vous devez exécuter N fois une commande INSERT, UPDATE, DELETE ou toute autre commande paramétrée, généralement une commande par enregistrement. Dans ce cas, chaque ensemble de paramètres d'entrée demande l'exécution d'une commande SQL et est transféré séparément entre le client et le serveur, augmentant considérablement la charge sur le réseau, le client et le serveur.

Array DML vous permet de transporter non seulement un, mais N ensembles de données en un seul transfert. Par exemple :

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

Les commandes Array DML vous permettent d'accélérer considérablement votre code, en ne se contentant pas de transférer un, mais N ensembles de paramètres.

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);

La propriété Params de la requête n'est plus un tableau unidimensionnel, mais un tableau bidimensionnel qui permet de stocker N ensembles de valeurs de paramètres avant de les envoyer vers le serveur.

Pour de plus amples informations, voir le chapitre de référence Array DML.

Conseils d'utilisation

  • Peut être utilisé pour toute commande SQL utilisant des paramètres (INSERT, UPDATE, DELETE ...).
  • La gestion des erreurs est supportée au niveau de l'enregistrement. Elle est décrite dans un autre article.
  • FireDAC unifie la commande Array DML pour différents types de serveurs (inutile d'aller puiser dans l'API).

Résultats types de l'exécution test de la commande Array DML

Le code de test attaché vous permet d'expérimenter la commande dans votre environnement spécifique.

ArrayDMLTestPicture.png

Les résultats du test utilisé en exemple peuvent considérablement varier en fonction des performances de l'hôte et du réseau. L'image type d'une base de données Oracle locale sur un ordinateur portable plutôt ancien affichera tout de même plus de 100 000 enregistrements par seconde, comme vous pouvez le voir dans cet écran :

AD03 ResultLog.png

Plus la taille du tableau est volumineuse, plus les performances sont élevées (dans le cas présent, jusqu'à un facteur de 2 000).

ArrayDMLTestResults.png

Conseils relatifs aux performances

Les performances de la commande Array DML sont influencées par les conditions suivantes :

  • Elles sont indéniablement plus rapides sur des réseaux lents, car ces commandes créent moins de packages TCP/IP.
  • Elles réduisent la charge du CPU côté client, le serveur étant principalement dédié à la commande Array DML.
  • La vitesse théorique de plus de 100 000 enr./s n'est pas fréquemment atteinte, car le serveur doit normalement évaluer les déclencheurs et les index.
  • Pour les insertions très volumineuses en mode groupé (par exemple, plus de 1 000 000 d'enregistrements), vous avez la possibilité de supprimer et de recréer des index de clés non primaires afin d'obtenir des performances maximales.

Voir aussi