Préambule :
Je parle de CTE dans le texte, mais ce qui est dit s’applique aussi bien aux view.
Depuis la version 2005 de Sql Server, avec les CTE (Common Table Expressions) et les possibilités d’en faire des appels récursifs, il n’est pas fou de se dire que presque tout traitement et récupération de données peut se faire par le biais d’une CTE.
Il est en effet possible d’effectuer des opérations très complexes au sein de ces CTE afin de faire tout voire n’importe quoi.
Les CTE nous permettent de définir des sous queries qui peuvent interagir les uns aves les autres.
Nous pourrions par exemple avoir une CTE « A » qui fait une sélection récursive particulière sur une table « X » et une autre CTE « B » qui fasse une sélection particulier sur une table « Y » et, enfin, joindre ces deux CTE pour arriver à notre résultat finale.
Il se pourrait très bien que nous ayons certains filtres portant sur notre résultat final qui pourraient permettre à nos deux CTE d’éliminer une certaines partie de leur travail mais qui hélas ne le font pas car ces filtres ne surviendraient qu’après ces traveaux effectués en « A » et en « B ».
Par exemple imaginons deux CTE « A » et « B ».
« A » et « B » font une sélection de certaines données dans des tables différentes (respectivement « X » et « Y ».
Dans les tables « X » et « Y » se trouvent des dates de début et des dates de fin qui, pour « X », peuvent indiquer des chevauchements.
« A » qui récupère les données de « X » élimine les chevauchements en « fusionnant » les lignes qui se chevaucheraient.
On pourrait imaginer différentes façon de procéder pour « A » mais il est probable (voire certains) que les champs de date de début et de fin ne soient plus SARGABLE (càd dont les index ne soient plus exploitables).
Si « A » et « B » ont une relation établie sur les dates de début et/ou dates de fin, on regretterait que cette relation ne permette pas en « A » de ne travailler que sur les éléments qui serviront réellement à établir notre résultat final.
Pour une question de performance il pourrait être salutaire de remplacer la CTE « A » par une fonction table (fonction renvoyant une table) « F » et dont ou pourrait paramétrer les dates de début et de fin à considérer.
Ainsi, nous aurions notre CTE « B » en relation avec notre fonction « F » paramétré vis-à-vis de B (via une opération de jonction de type APPLY) où les index de « X »seraient utilisés intelligemment.
Voilà, j’espère que malgré l’absence d’exemple exhaustif, cette explication vous permettra de rester vigilant quant aux cas où une fonction table pourra aider les performances de vos queries.
PS: J'attends vos remarques et réflexions pour peut-être rédiger autrement cette explication.
Partager