164
Chapitre 6. Utilisation des index
pour d’autres (en incluant dans le filtre seulement les valeurs très sélectives), pour
diminuer la taille de l’index et le rendre plus efficace. En voici un exemple, qui crée
un index filtré sur une colonne de type bit, censée représenter un flag actif/inactif :
CREATE TABLE dbo.testfiltered (
id int NOT NULL PRIMARY KEY,
Active bit NOT NULL,
fluff char(896) NOT NULL DEFAULT ('b'));
INSERT INTO dbo.testfiltered (id, Active)
SELECT ContactId, 0 FROM AdventureWorks.Person.Contact
UPDATE t1 SET Active = 1
FROM dbo.testfiltered t1
JOIN (SELECT TOP (10) id FROM dbo.testfiltered ORDER BY NEWID()) t2
ON t1.id = t2.id
CREATE INDEX nix$dbo_testfiltered$active
ON dbo.testfiltered (Active)
WHERE Active = 1;
CREATE INDEX nix$dbo_testfiltered$activeNotFiltered
ON dbo.testfiltered (Active);
DBCC SHOW_STATISTICS ('dbo.testfiltered', 'nix$dbo_testfiltered$active')
DBCC SHOW_STATISTICS ('dbo.testfiltered',
'nix$dbo_testfiltered$activeNotFiltered')
SELECT *
FROM dbo.testfiltered
WHERE Active = 1;
Dans cet exemple, l’index nix$dbo_testfiltered$active est choisi par
l’optimiseur : il est plus compact que l’index non filtré, et donc plus rapide à parcourir. Nous avons délibérément ajouté une colonne nommée fluff pour alourdir la
table, donc le nombre de pages qui la contiennent. Nous avons aussi utilisé une
astuce pour mettre à jour dix lignes aléatoires, à l’aide d’un ORDER BY NEWID() :
NEWID() retournant un GUID différent à chaque ligne. Cette astuce est coûteuse en
performances, elle n’est à utiliser que dans ce type de tests.
6.1.3 Création d’index
Après avoir présenté les différents types d’index, il nous reste à parler simplement de
la création de ceux-ci. Nous avons vu dans nos codes d’exemple, la syntaxe de création. Nous pouvons la résumer ainsi (les valeurs soulignées représentent les valeurs
par défaut et les instructions en italiques ne sont valables que pour SQL Server
2008) :
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON ( colonne [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( colonne [ ,...n ] ) ]
Chapitre 6. Utilisation des index
pour d’autres (en incluant dans le filtre seulement les valeurs très sélectives), pour
diminuer la taille de l’index et le rendre plus efficace. En voici un exemple, qui crée
un index filtré sur une colonne de type bit, censée représenter un flag actif/inactif :
CREATE TABLE dbo.testfiltered (
id int NOT NULL PRIMARY KEY,
Active bit NOT NULL,
fluff char(896) NOT NULL DEFAULT ('b'));
INSERT INTO dbo.testfiltered (id, Active)
SELECT ContactId, 0 FROM AdventureWorks.Person.Contact
UPDATE t1 SET Active = 1
FROM dbo.testfiltered t1
JOIN (SELECT TOP (10) id FROM dbo.testfiltered ORDER BY NEWID()) t2
ON t1.id = t2.id
CREATE INDEX nix$dbo_testfiltered$active
ON dbo.testfiltered (Active)
WHERE Active = 1;
CREATE INDEX nix$dbo_testfiltered$activeNotFiltered
ON dbo.testfiltered (Active);
DBCC SHOW_STATISTICS ('dbo.testfiltered', 'nix$dbo_testfiltered$active')
DBCC SHOW_STATISTICS ('dbo.testfiltered',
'nix$dbo_testfiltered$activeNotFiltered')
SELECT *
FROM dbo.testfiltered
WHERE Active = 1;
Dans cet exemple, l’index nix$dbo_testfiltered$active est choisi par
l’optimiseur : il est plus compact que l’index non filtré, et donc plus rapide à parcourir. Nous avons délibérément ajouté une colonne nommée fluff pour alourdir la
table, donc le nombre de pages qui la contiennent. Nous avons aussi utilisé une
astuce pour mettre à jour dix lignes aléatoires, à l’aide d’un ORDER BY NEWID() :
NEWID() retournant un GUID différent à chaque ligne. Cette astuce est coûteuse en
performances, elle n’est à utiliser que dans ce type de tests.
6.1.3 Création d’index
Après avoir présenté les différents types d’index, il nous reste à parler simplement de
la création de ceux-ci. Nous avons vu dans nos codes d’exemple, la syntaxe de création. Nous pouvons la résumer ainsi (les valeurs soulignées représentent les valeurs
par défaut et les instructions en italiques ne sont valables que pour SQL Server
2008) :
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON
[ INCLUDE ( colonne [ ,...n ] ) ]
