Fonction Filter – Performance et délégation

  • Fonction Filter – Performance et délégation

    Posté par Sebastien sur 13 novembre 2024 à 13h12

    Bonjour à tous.

    Récemment, la plupart des questions que je me suis posées vis à vis de Canvas concernent les performances des app et comment les optimiser. Principalement à propos des fonctions Filter.

    Un petit récap pour ceux qui ne le savent pas, certaines fonctions (à savoir Filter, Lookup, First et Search) peuvent être déléguées, c’est-à-dire qu’elles peuvent être traitées du côté de la donnée plutôt que directement dans canvas, ce qui est supposé optimiser le temps de requête et surtout ce qui permet de traiter l’intégralité de la donnée plutôt que les 500 à 2000 (en fonction des paramètres) premiers enregistrements disponibles si vous devez traiter votre source de données dans canvas. Pour plus d’informations sur le sujet, cliquez ici.

    En fonction des différentes sources de données, les opérateurs utilisés peuvent être déléguables ou non. Personnellement, j’utilise beaucoup Dataverse en parallèle avec canvas, et la meilleure solution que j’ai trouvée lorsque la formule nous le permet est la suivante :

    Ici, on utilise une vue Dataverse en guise de formule de filtre, donc on n’a littéralement aucune opération côté canvas, on interroge la vue Dataverse et elle nous retourne les enregistrements qu’on veut en fonction de son filtre. Cette solution est idéale que ce soit d’un point de vue du nombre d’enregistrements traités (puisque la requête est entierement traitée côté donnée, on est certains que notre recherche est faite sur l’intégralité de la table), et point de vue performance, j’ai pu constater une amélioration sur les grosses requêtes (en éspérant que ce ne soit pas simplement mon biais d’observation). Cependant, la limitation est évidente, si on a besoin de faire un filtre par rapport à une information présente uniquement dans notre app, on ne peut pas la faire passer à la vue.

    J’en viens donc à ma question : à votre avis, quelle est la version la plus performante de la requête suivante :

    Ici, on cherche les devis liés à l’opportunité sélectionnée précédemment dans l’app (condition interne) qui répondent à une condition spécifique que l’on peut mettre sous la forme d’une vue dataverse (externe).

    Selon vous, est-il donc plus performant de faire 2 fonctions Filter imbriquées, l’une se basant sur une requête externe, et l’autre venant ajouter le reste de notre condition, ou de faire une seule fonction Filter avec l’intégralité de la requête ? Y a-t-il d’autres facteurs qui influent dont je n’ai pas parlé ?

    __________________________________________________________________________________________________________________________________________________________

    Voila, voila, je sais que la question est assez spécifique, mais si l’un ou l’une d’entre vous c’est déjà frotté à ce cas de figure ou a simplement une opinion je suis très intéressé. Sur une note en rapport, la plupart des guides d’optimisations des app canvas que j’ai trouvé sur le net sont soit très datés soit plutôt à côté de la plaque, je pensait en refaire un et le poster sur ce forum dans les semaines à venir, donc si vous avez vos propre trucs et astuces que vous voulez partager je serait reconnaissant !

    • Cette discussion a été modifiée Il y a 2 mois par  Sebastien.
    • Cette discussion a été modifiée Il y a 2 mois par  Sebastien.
    • Cette discussion a été modifiée Il y a 2 mois par  Sebastien.
    Sebastien a répondu Il y a 2 mois 2 Membres · 2 Réponses
  • 2 Réponses
  • DavidZed

    Membre
    13 novembre 2024 à 18h58

    Hello,

    En terme de performances, imbriquer les Filter() n’a pas ou peu d’impact (il me semble, à tester sur des gros volumes de données)

    Par contre, en terme de lisibilité, il sera plus efficace d’utiliser la capacité de la fonction Filter à cumuler autant de tests logiques que nécessaire pour le filtrage, par exemple, pour reprendre à peu près les mêmes filtres que dans ton exemple, tu peux faire :

    On peut tout à fait cumuler le filtre basé sur la vue avec un test booléen.

    Note également que la fonction IsBlank(‘Champ’) n’est pas délégable, par contre la fonction ‘Champ = Blank() le sera 🙂

  • Sebastien

    Membre
    14 novembre 2024 à 11h33

    Oh super !

    Merci Beaucoup, je vais tester tout ça.

Connectez-vous pour répondre.