22 octobre 2009
publié par 



Dans une base HFSQL Client/Serveur, lorsqu'une sélection d'enregistrements est nécessaire, il est plus intéressant de demander au serveur d'effectuer une requête de sélection que de demander les enregistrements de manière séquentielle avec un filtre. En effet, lors d'un parcours séquentiel de type :

HFiltre(CLIENT,DEPARTEMENT,"34000","34999")
HLitPremier(CLIENT,DEPARTEMENT)
TANTQUEPAS
HEnDehors()
//Traitement
HLitSuivant()
FIN

La couche client demande le premier enregistrement au serveur, celui-ci lui retourne le premier et le second enregistrement (pour anticiper la boucle) et prépare sur le serveur les 50 enregistrements suivants qui seront renvoyés pendant le parcours (sauf si le client est sous mobile auquel cas le cache est désactivé par défaut). Cette technique permet d'améliorer les performances de l'application par rapport à une lecture purement séquentielle mais a l'inconvénient de consommer de la mémoire sur le serveur.

Prenons un exemple : Si chaque enregistrement a une taille de 300 Ko, et que 100 utilisateurs sont connectés, cela représente 600 Mo de mémoire consommée sur le serveur HFSQL pour la simple boucle précédente.
Remarque : le cache du serveur est purgé lorsque la boucle positionne HEnDehors() à vrai.

Il est donc conseillé de remplacer votre parcours d'enregistrements par une requête :

REQ_CLIENT_PAR_DEPARTEMENT="34"
HExécuteRequête
(REQ_CLIENT_PAR_DEPARTEMENT)
POUR TOUT
REQ_CLIENT_PAR_DEPARTEMENT
//Traitement

FIN

REQ_CLIENT_PAR_DEPARTEMENT étant une requête construite par l'éditeur de requêtes ou en code SQL : SELECT * FROM CLIENT WHERE DEPARTMENT [= ‘<Param1>'


Dans ce cas, la requête est préparée sur le serveur et envoyée vers le client, le serveur ne garde pas d'enregistrement en mémoire. La mémoire est consommée sur le poste client qui traite les enregistrements, et il est possible de libérer cette mémoire au moyen de la commande HAnnuleDéclaration.



< Retour