Bonjour.
Comme j'ai rencontré un problème plutôt obscure, j'aimerais partager avec vous la solution que je lui ai trouvé au cas où un jour vous rencontriez le même sans ne plus avoir quoi faire.
J'avais un problème un performance grave.
Pour une raison qui m'échappe peut-être encore un query impliquant une table variable au sein d'une transaction était infiniment lent.
J'étais pourtant sûr d'avoir intelligemment écrit la définition de cette table variable (avec une clé primaire nécessaire pour une bonne performance) et de mes query mais le fait était là : mon query n'en finissait jamais.
J'ai fait plusieurs essaies d'écriture alternative de mes query, rien n'y changeait.
À la lecture du query plan je pouvais quand même remarqué une particularité, l'index du à la clé primaire de ma table n'était pas utilisé et l'estimation du coût des query était euphorique en comparaison avec le résultat réel.
J'ai tenté quelque chose d'inhabituel : remplacer la table variable par une table temporaire.
Et là, non seulement le query pouvait s'achever mais en plus il s'achevait rapidement (comme je prévoyais qu'il le fasse avec une table variable).
J'en ai tiré la conclusion que Sql server fesait peut-être le plan d'excecution impliquant la table variable sans considérer correctement que cette table évoluait très fort pendant la tansaction et avant d'atteindre les query "à problème".
J'ai donc rajouté l'option RECOMPILE à mon query et réutiliser la table variable plutôt qu'une table temporaire.
Mais à nouveau, les performances étaient atroces.
En fait, dans la solution que j'ai maintenant et qui me satisfait, le query est toujours celui là. Il m'a juste fallu chercher pour découvrir qu'il me fallait augmenter la taille de TEMPDB.
Mais sans l'option RECOMPILE, quoi que soit fait à TEMPDB, mon query avec table variable est catastrophique.
J'espère que ça en aidera certains et, à moins que d'autres utilisateurs du forum m'ouvre les yeux sur d'autres éléments qui m'auraient échappés, je copierai ce post dans la rubrique des contributions.
Partager