256
Chapitre 8. Optimisation du code SQL
8.2 GESTION AVANCÉE DES PLANS D’EXÉCUTION
Vous pouvez modifier le plan d’exécution généré par l’optimiseur de deux façons :
soit en ajoutant à la requête des indicateurs spécifiques forçant certaines stratégies
logiques ou physiques de résolution de la requête, soit en y appliquant un plan
d’exécution « fait main » complet, à l’aide des guides de plan (plan guides). Nous
allons passer les deux solutions en revue. Mais avant cela, il nous faut répéter encore
que ces fonctionnalités ne sont à considérer qu’en dernier ressort, et lorsque vous
savez ce que vous faites. Soyez notamment conscient des répercussions lors de changement de structure ou de distribution des valeurs dans les tables. Par exemple, un
guide de plan qui force l’utilisation d’un index qui a disparu, génère une erreur.
8.2.1 Indicateurs de requête et de table
Vous avez à disposition des indicateurs (hints) permettant d’indiquer à l’optimiseur
une stratégie préférée, voire de le forcer à utiliser une méthode, un index, et jusqu’à
un plan d’exécution prédéfini. Certains de ces indicateurs sont intéressants, mais ils
ne devraient être utilisés qu’en cas de réel besoin. Le moteur d’optimisation de SQL
Server est très performant, et le forcer à se comporter d’une certaine manière est en
général contre-indiqué. Cette mise en garde faite, nous allons présenter ici ces indicateurs, et tâcher d’expliquer quand ils peuvent être utilisés, et quand ils ne
devraient pas l’être.
On utilise un indicateur à même la requête, soit à la fin de celle-ci avec la clause
OPTION() pour les indicateurs de requête (query hints), soit après une table avec la
clause WITH() pour les indicateurs de tables (table hints). Voici un exemple d’utilisation d’un indicateur de requête forçant un certain algorithme de jointure :
SELECT *
FROM Sales.Customer c
JOIN Sales.CustomerAddress ca
ON c.CustomerID = ca.CustomerID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
Indicateurs de requête
Les indicateurs de requête disponibles sont les suivants :
{ HASH | ORDER } GROUP
{ CONCAT | HASH | MERGE } UNION
{ LOOP | MERGE | HASH } JOIN
Ces trois indicateurs permettent de forcer les algorithmes d’agrégation (voir section 8.1.1), d’UNION et de jointure. Évitez de forcer ce choix, à de rares exceptions
près, l’optimiseur sait ce qu’il fait.
1. Référence sur le Hash Aggregate : http://blogs.msdn.com/craigfr/archive/2006/09/20/hashaggregate.aspx
Chapitre 8. Optimisation du code SQL
8.2 GESTION AVANCÉE DES PLANS D’EXÉCUTION
Vous pouvez modifier le plan d’exécution généré par l’optimiseur de deux façons :
soit en ajoutant à la requête des indicateurs spécifiques forçant certaines stratégies
logiques ou physiques de résolution de la requête, soit en y appliquant un plan
d’exécution « fait main » complet, à l’aide des guides de plan (plan guides). Nous
allons passer les deux solutions en revue. Mais avant cela, il nous faut répéter encore
que ces fonctionnalités ne sont à considérer qu’en dernier ressort, et lorsque vous
savez ce que vous faites. Soyez notamment conscient des répercussions lors de changement de structure ou de distribution des valeurs dans les tables. Par exemple, un
guide de plan qui force l’utilisation d’un index qui a disparu, génère une erreur.
8.2.1 Indicateurs de requête et de table
Vous avez à disposition des indicateurs (hints) permettant d’indiquer à l’optimiseur
une stratégie préférée, voire de le forcer à utiliser une méthode, un index, et jusqu’à
un plan d’exécution prédéfini. Certains de ces indicateurs sont intéressants, mais ils
ne devraient être utilisés qu’en cas de réel besoin. Le moteur d’optimisation de SQL
Server est très performant, et le forcer à se comporter d’une certaine manière est en
général contre-indiqué. Cette mise en garde faite, nous allons présenter ici ces indicateurs, et tâcher d’expliquer quand ils peuvent être utilisés, et quand ils ne
devraient pas l’être.
On utilise un indicateur à même la requête, soit à la fin de celle-ci avec la clause
OPTION() pour les indicateurs de requête (query hints), soit après une table avec la
clause WITH() pour les indicateurs de tables (table hints). Voici un exemple d’utilisation d’un indicateur de requête forçant un certain algorithme de jointure :
SELECT *
FROM Sales.Customer c
JOIN Sales.CustomerAddress ca
ON c.CustomerID = ca.CustomerID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
Indicateurs de requête
Les indicateurs de requête disponibles sont les suivants :
{ HASH | ORDER } GROUP
{ CONCAT | HASH | MERGE } UNION
{ LOOP | MERGE | HASH } JOIN
Ces trois indicateurs permettent de forcer les algorithmes d’agrégation (voir section 8.1.1), d’UNION et de jointure. Évitez de forcer ce choix, à de rares exceptions
près, l’optimiseur sait ce qu’il fait.
1. Référence sur le Hash Aggregate : http://blogs.msdn.com/craigfr/archive/2006/09/20/hashaggregate.aspx
