Souci suite à la Migration de bases de 2014 vers 2019
par
, 20/01/2024 à 10h18 (336 Affichages)
En fait ce qui s'est passé a été prévu par SQL Server...
Depuis la version 2017, Microsoft a beaucoup travaillé sur de nouvelles optimisations dans le cadre d'un projet appelé "Intelligent Query Processor" (IQP), dont l'une des fonctionnalité consiste à supprimer l'appel de la fonction (UDF) en l'intégrant directement dans la requête afin que le tout soit optimisé. Cela s'appelle l'inligning (enlignement)...
En effet, les requêtes ont un comportement ensembliste (toutes les opérations s'effectuent en même temps <=> parallélisme) alors qu'une fonction est toujours itérative (c'est à dire que le code se déroule séquentiellement) ce qui fait que l'introduction de fonctions dans le code d'une requête casse ordinairement le fonctionnement ensembliste de la requête et la rend itérative et par conséquent lente... Pour palier à ce problème de performance Microsoft Research a initié le projet "FROID" a eut pour but de récrire les requêtes en réintégrant le code SQL de la fonction dans la requête. . On obtient alors une requête parfaitement ensembliste et les performances n'ont plus rien à voir....
Cependant, ce mode a un inconvénient : il étudie toutes les possibilités d'exécution simultanément, alors que l'itération dans le code d'une UDF coupe des branches via les commande de contrôle telles que IF THEN ELSE...
Sachant cela, il y a quelques rares cas ou cet "enlignement" de la fonction peut devenir un problème et c'est votre cas... En effet, une requête est compilée d'un seul bloc et l'absence de certains objets à ce moment peut se révéler critique...
Pour palier à cet effet de bord, Microsoft SQL Server a rajouté une option dans la création des fonctions (INLINE = OFF) afin d'interdire l'enlignement d'une UDF au cas ou cela produirait une anomalie...
Vous êtes tombé dessus !
A +