258
Chapitre 8. Optimisation du code SQL
Cela permet d’éviter dans tous les cas les valeurs extrêmes. En général, pour les
colonnes qui ont une distribution très hétérogène (quelques valeurs très sélectives,
d’autres avec beaucoup de doublons), une stratégie de scan sera choisie. Il est inutile
de spécifier cet indicateur pour des colonnes avec une contrainte ou un index unique. Dans ce cas le plan n’a pas de risque d’être mal estimé.
RECOMPILE
Force la recompilation systématique de l’instruction. Utile à l’intérieur d’un
objet de code. Nous le verrons plus en détail dans la section 9.2.1.
PARAMETERIZATION { SIMPLE | FORCED }
Force un auto-paramétrage. Nous verrons cet indicateur plus en détail dans la
section 9.3.
KEEP PLAN, KEEPFIXED PLAN
permet de diminuer le nombre de recompilations produites sur une instruction
dans un objet de code. Au fil des versions, SQL Server provoque de moins en moins
de recompilation en cachant de mieux en mieux les instructions individuellement.
KEEP PLAN diminue le nombre de recompilations dues à des changements de cardinalité (utile pour une table temporaire, qui va provoquer une recompilation après une
insertion première de six lignes), KEEPFIXED PLAN empêche une recompilation due à
des changements de statistiques de distribution. Nous le verrons plus en détail dans
la section 8.3.1.
EXPAND VIEWS
Indique que les index d’une vue indexée ne doivent pas être utilisés pour satisfaire la requête, mais que le plan doit se calculer sur les tables sous-jacentes. L’indicateur de table WITH(NOEXPAND) provoque l’effet inverse : seuls les index de la vue sont
considérés.
MAXRECURSION nombre_de_récursions
Limite le nombre d’appels récursifs dans une expression de table (common table
expression, CTE) récursive.
USE PLAN N'xml_plan'
Vous permet de « coller » un plan d’exécution en format XML. Cet indicateur
ne peut être utilisé que dans un SELECT. C’est l’indicateur le plus dangereux, car il
fixe tout le plan d’exécution dans le marbre. Il suffit qu’un élément de la structure
de table qui y est référencé soit supprimé, pour provoquer une erreur d’exécution.
De même, une fonctionnalité de plan modifiée dans une version ultérieure invalide
aussi le plan. N’utilisez cette fonctionnalité qu’en dernier ressort, quand par exemple vous connaissez un meilleur plan, généré par une version antérieure de SQL
Server, et que la mise à jour a dégradé les performances. Vous pouvez récupérer le
plan à l’aide de SET SHOWPLAN_XML, et le passer à la requête. Envoyez ce plan en UNICODE, avec le N devant le littéral, pour éviter des conversions de caractère indésirables à l’enregistrement du plan. Le plan doit pouvoir être validé par le schéma
Chapitre 8. Optimisation du code SQL
Cela permet d’éviter dans tous les cas les valeurs extrêmes. En général, pour les
colonnes qui ont une distribution très hétérogène (quelques valeurs très sélectives,
d’autres avec beaucoup de doublons), une stratégie de scan sera choisie. Il est inutile
de spécifier cet indicateur pour des colonnes avec une contrainte ou un index unique. Dans ce cas le plan n’a pas de risque d’être mal estimé.
RECOMPILE
Force la recompilation systématique de l’instruction. Utile à l’intérieur d’un
objet de code. Nous le verrons plus en détail dans la section 9.2.1.
PARAMETERIZATION { SIMPLE | FORCED }
Force un auto-paramétrage. Nous verrons cet indicateur plus en détail dans la
section 9.3.
KEEP PLAN, KEEPFIXED PLAN
permet de diminuer le nombre de recompilations produites sur une instruction
dans un objet de code. Au fil des versions, SQL Server provoque de moins en moins
de recompilation en cachant de mieux en mieux les instructions individuellement.
KEEP PLAN diminue le nombre de recompilations dues à des changements de cardinalité (utile pour une table temporaire, qui va provoquer une recompilation après une
insertion première de six lignes), KEEPFIXED PLAN empêche une recompilation due à
des changements de statistiques de distribution. Nous le verrons plus en détail dans
la section 8.3.1.
EXPAND VIEWS
Indique que les index d’une vue indexée ne doivent pas être utilisés pour satisfaire la requête, mais que le plan doit se calculer sur les tables sous-jacentes. L’indicateur de table WITH(NOEXPAND) provoque l’effet inverse : seuls les index de la vue sont
considérés.
MAXRECURSION nombre_de_récursions
Limite le nombre d’appels récursifs dans une expression de table (common table
expression, CTE) récursive.
USE PLAN N'xml_plan'
Vous permet de « coller » un plan d’exécution en format XML. Cet indicateur
ne peut être utilisé que dans un SELECT. C’est l’indicateur le plus dangereux, car il
fixe tout le plan d’exécution dans le marbre. Il suffit qu’un élément de la structure
de table qui y est référencé soit supprimé, pour provoquer une erreur d’exécution.
De même, une fonctionnalité de plan modifiée dans une version ultérieure invalide
aussi le plan. N’utilisez cette fonctionnalité qu’en dernier ressort, quand par exemple vous connaissez un meilleur plan, généré par une version antérieure de SQL
Server, et que la mise à jour a dégradé les performances. Vous pouvez récupérer le
plan à l’aide de SET SHOWPLAN_XML, et le passer à la requête. Envoyez ce plan en UNICODE, avec le N devant le littéral, pour éviter des conversions de caractère indésirables à l’enregistrement du plan. Le plan doit pouvoir être validé par le schéma
