259
8.2 Gestion avancée des plans d’exécution
Showplanxml.xsd, disponible dans le répertoire d’installation de SQL Server, ou sur
le site de Microsoft.
Une option de session : SET FORCEPLAN { ON | OFF }, force également les plans
d’exécution de deux façons : les instructions exécutées dans la session respecteront
l’ordre d’apparition des tables dans la clause FROM, et l’opérateur de jointure en boucle imbriquée (nested loop) sera partout utilisé, à moins qu’un indicateur force un
autre algorithme. Autant dire que cette option est à laisser à OFF.
Indicateurs de table
Les indicateurs de table s’ajoutent après la déclaration de table, dans une clause
FROM, comme ceci :
SELECT FirstName, LastName
FROM Person.Contact WITH (READUNCOMMITTED);
Nous en listons ici les principaux. La plupart concernent les verrouillages, nous
ne les abordons que succinctement, entrant plus en détail sur le sujet dans le chapitre 7.
• FORCESEEK : exclusivement en SQL Server 2008 : force une stratégie de seek
d’index plutôt qu’un scan.
• NOEXPAND : force l’utilisation des index sur une vue indexée.
• INDEX ( index_val [ ,...n ] ) :force l’utilisation d’un index (même s’il n’a
rien à voir avec le critère de filtre de la clause WHERE.
• HOLDLOCK : force le niveau d’isolation SERIALIZABLE pour la table.
• NOLOCK : force le niveau d’isolation READ UNCOMMITTED pour la table.
• NOWAIT : désactive l’attente de verrous. Si la table est verrouillée à l’exécution
de la requête, SQL Server renvoie une erreur immédiatement.
• PAGLOCK : force le choix d’une granularité de verrous par pages, au lieu d’une
granularité par ligne ou par table.
• READCOMMITTED : force le niveau d’isolation READ COMMITTED pour la table
(niveau d’isolation par défaut de SQL Server), utilise le row versioning si la
base est en mode READ_COMMITTED_SNAPSHOT.
• READCOMMITTEDLOCK : force le niveau d’isolation READ COMMITTED pour la table,
sans utiliser le row versioning même si la base est en mode
READ_COMMITTED_SNAPSHOT.
• READPAST : force la lecture d’une table sans attendre la libération des verrous
incompatibles. Cela peut donc entraîner une lecture incomplète, mais rapide
(on n’obtient donc que l’argent du beurre, mais pas forcément le beurre). Par
exemple, le code suivant ne va lire que quatre lignes sur cinq (les nombres 1,
2, 4, 5) :
CREATE TABLE dbo.ReadPast (nombre int not null)
INSERT INTO dbo.ReadPast (nombre) VALUES (1)
INSERT INTO dbo.ReadPast (nombre) VALUES (2)
8.2 Gestion avancée des plans d’exécution
Showplanxml.xsd, disponible dans le répertoire d’installation de SQL Server, ou sur
le site de Microsoft.
Une option de session : SET FORCEPLAN { ON | OFF }, force également les plans
d’exécution de deux façons : les instructions exécutées dans la session respecteront
l’ordre d’apparition des tables dans la clause FROM, et l’opérateur de jointure en boucle imbriquée (nested loop) sera partout utilisé, à moins qu’un indicateur force un
autre algorithme. Autant dire que cette option est à laisser à OFF.
Indicateurs de table
Les indicateurs de table s’ajoutent après la déclaration de table, dans une clause
FROM, comme ceci :
SELECT FirstName, LastName
FROM Person.Contact WITH (READUNCOMMITTED);
Nous en listons ici les principaux. La plupart concernent les verrouillages, nous
ne les abordons que succinctement, entrant plus en détail sur le sujet dans le chapitre 7.
• FORCESEEK : exclusivement en SQL Server 2008 : force une stratégie de seek
d’index plutôt qu’un scan.
• NOEXPAND : force l’utilisation des index sur une vue indexée.
• INDEX ( index_val [ ,...n ] ) :force l’utilisation d’un index (même s’il n’a
rien à voir avec le critère de filtre de la clause WHERE.
• HOLDLOCK : force le niveau d’isolation SERIALIZABLE pour la table.
• NOLOCK : force le niveau d’isolation READ UNCOMMITTED pour la table.
• NOWAIT : désactive l’attente de verrous. Si la table est verrouillée à l’exécution
de la requête, SQL Server renvoie une erreur immédiatement.
• PAGLOCK : force le choix d’une granularité de verrous par pages, au lieu d’une
granularité par ligne ou par table.
• READCOMMITTED : force le niveau d’isolation READ COMMITTED pour la table
(niveau d’isolation par défaut de SQL Server), utilise le row versioning si la
base est en mode READ_COMMITTED_SNAPSHOT.
• READCOMMITTEDLOCK : force le niveau d’isolation READ COMMITTED pour la table,
sans utiliser le row versioning même si la base est en mode
READ_COMMITTED_SNAPSHOT.
• READPAST : force la lecture d’une table sans attendre la libération des verrous
incompatibles. Cela peut donc entraîner une lecture incomplète, mais rapide
(on n’obtient donc que l’argent du beurre, mais pas forcément le beurre). Par
exemple, le code suivant ne va lire que quatre lignes sur cinq (les nombres 1,
2, 4, 5) :
CREATE TABLE dbo.ReadPast (nombre int not null)
INSERT INTO dbo.ReadPast (nombre) VALUES (1)
INSERT INTO dbo.ReadPast (nombre) VALUES (2)
