Performances de ORDA en C/S

J’essaie de mettre en pratique des queries après ma formation ORDA de cette semaine.

J’utilise le debugger pour tracer et comprendre et je vois que 4D met un temps non négligeable sur le query().

Je teste une requete basique qui fait intervenir un lien vers une autre table.
J’ai nommé correctement mon lien dans la base (et redémarré bien sur).

Je pensais que les 2 syntaxes étaient équivalentes : en résultat oui mais en temps d’exécution non.
J’ai l’impression de revivre la même chose qu’en SQL sur les jointures.

Mon query n’est pas correct ? Erreur de raisonnement ?

<code 4D>
ON ERR CALL("")

C_TEXT($queryPathClassic)
C_OBJECT($queryPathOrda)

$startOrda:=Milliseconds
$selEntityClient:=ds.CLIENTS.query(“client__category.Country = France”;New object(“queryPath”;True;“queryPlan”;True))
$ordaQueryTime:=Milliseconds-$startOrda
$queryPathOrda:=$selEntityClient.queryPath

$entityClient:=$selEntityClient.first()

DESCRIBE QUERY EXECUTION(True)
$startClassic:=Milliseconds
QUERY([CLIENTS];[CATEGORIES]Country=“France”)
$classicQueryTime:=Milliseconds-$startClassic
$queryPathClassic:=Get last query plan(Description in text format)
DESCRIBE QUERY EXECUTION(False)

TRACE

</code 4D>

[]32226700;“Your comment here…”[/]

Tu as testé en répétant plusieurs fois ?

Oui, toujours le même temps.
Je suis avec une 17.3 4D client Windows (interprété) et serveur 17.3 Windows 64 bits

Bonjour,

Il faut lire le blog et utiliser la version R.

https://blog.4d.com/use-orda-to-boost-performance-in-client-server-mode/

Cordialement

C’est même pire après 2 ou 3 itérations.

[]32226928;“Your comment here…”[/]

Ok Olivier, je vais tester avec la v18 et ou 17R6.

Test en v18.0 build de ce jour.

J’ai fait une boucle de 10 itérations pour voir (juste après le démarrage de la base).
C’est beaucoup mieux sans égaler la version “classique”, surtout à la première requête.
On peut penser que d’autres optimisations vont venir avec le temps, en l’état cela me va.

[]32260319;“Your comment here…”[/]

Bonjour,

Comme souvent c’est avec ce genre de tests que l’on tire des
conclusions hâtives sans ce rendre compte qu’elles n’ont aucun sens.
Si je m’en réfère au code exposé, le code commence par ORDA puis fait
du classique. Il est donc normal et logique que le premier test en
ORDA soit défavorable, car il faut compter le temps de chargement du
cache.

: Vincent HENNIQUE

C’est beaucoup mieux sans égaler la version “classique”, surtout à la
première requête.

Cette phrase montre donc que l’analyse de la situation n’a pas été faite, mais que la conclusion a été tirée …
Déplus un simple test sur une boucle de 10 itérations a autant de sens que les consommations annoncées par les constructeurs automobiles sur leurs brochures.
C’est dans une base réelle que l’on fait des tests et surtout pas juste après le démarrage.

: Vincent HENNIQUE

On peut penser que d’autres optimisations vont venir avec le temps

Ah bon ? Avez-vous déjà tiré parti de toutes les optimisations et épuisé les possibilités des contextes offertes dans la version actuelle ?

Enfin, comme je l’ai dit lors du dernier Summit, il est super important de ne pas comparer car cela sera forcement biaisé. Une comparaison suppose une base commune, or ORDA et le 4D Classique n’ont de commun que les données. Faire un test unitaire test tel que celui ci c’est faire abstraction des possibilités offertes et c’est se mettre par avance des oeillères. La performance brute d’accès aux données n’est qu’une toute petite partie des performances globales de la base, que cela soit en ORDA ou en 4D Classique.

Cordialement,

Toujours des commentaires compréhensifs et aimables…

J’ai beau examiner mon post initial je n’y vois aucune agressivité. Relisez moi bien.

Je suis sorti enthousiaste de ma formation ORDA et cette première expérience m’avait quelque peu refroidi.

Bien sur que ces tests n’ont aucune valeur “scientifique” et d’ailleurs ils n’ont aucune autre prétention que de partager mes inquiétudes (j’aurai du me limiter à 2 itérations c’est un fait).

Ceci cela montre clairement qu’il y a un doute dans le passage à ORDA en v17.
Ce qui est appelé optimisation n’est pour moi que mise au point.

Je ne suis pas un bon codeur 4D et je n’ai jamais revendiqué cette compétence.

Mais je peux montrer moultes requêtes SQL qui se retrouvaient non viables en environnement de production.
Je connais la réponse : pas parce que je code mes mon SQL comme mes pieds, c’est endémique à la logique des jointures, cela a été expliqué sur d’autres fils.
Je n’ai pas envie de revivre la même chose avec ORDA.

V.

Juste une précision supplémentaire, les 2 recherches ne sont pas strictement équivalentes.

Il faut bien comprendre que dans le cas d’ORDA on a en plus le respect du contexte qui n’est pas présent avec une recherche classique.

Cela peut s’avérer TRÈS important dans le contexte de recherche sur une même table au sein d’un même process. Là, où avant, il fallait faire des tourne-autour pas possible, aujourd’hui en une ligne de code je résous le problème grâce à ORDA.

Alors, même si je n’ai pas exactement les mêmes performances brutes (ce qui reste à démontrer) cela peut quand même avoir un intérêt d’utiliser ORDA plutôt que l’utilisation classique.

Et personne n’a dit qu’il fallait tout récrire en ORDA (cela m’étonnerait qu’on vous ait conseillé cela en formation). C’est souvent un défaut qu’on a (nous autres développeurs ;-)) c’est de vouloir utiliser partout une nouveauté qu’on vient de découvrir.

Alors pour remplacer du code en SQL (utilisé exprès pour conserver le contexte) : oui, pour remplacer du code classique, si on est obligé de recoder autre chose : oui. Mais, le faire juste pour des besoins d’optimisation, je ne suis pas sûr…

Bonjour Vincent,

Pour voir le bénéfice des optimisations ORDA dont parle Olivier (https://blog.4d.com/use-orda-to-boost-performance-in-client-server-mode/),

il faut exploiter l’entity selection récupérée avec la query ORDA ($selEntityClient).

Par exemple, faire une boucle for each dessus et utiliser des attributs de la table CLIENTS et surtout des tables liées (table correspondant au lien client__category par exemple).