Bonjour,
J'ai un problème d'interprétation sur la variabilité de la séléctivité de l'optimiseur pour un index Non Cluster.
Autrement dit à partir de quel pourcentage du nombre total de lignes d'une table, l'optimiseur préfère un TABLE SCAN à la place d'un INDEX SEEK pour une requête SARGable ?
Voici ma démarche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 --Création de la table SET NOCOUNT ON IF OBJECT_ID('dbo.T_TEST') IS NOT NULL DROP TABLE dbo.T_TEST CREATE TABLE dbo.T_TEST ( id int identity(1,1), val varchar(10), creation_date datetime ) --Chargement d'1 million de lignes dans la table DECLARE @counter int; SET @counter = 1; WHILE @counter <= 1000000 BEGIN INSERT INTO T_TEST(val,creation_date) VALUES(convert(varchar(10),(LEFT(convert(bigint,RAND()*10000000),6))),getdate()); SET @counter = @counter + 1 END; --Création d'index sur la colonne val CREATE INDEX IX_VAL ON dbo.T_TEST(val)
La requête de test :
-- Requête pour imposer le % de lignes renvoyées par la requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM dbo.T_TEST WHERE val = '0'
# Pour imposer 1% du nombre total de lignes renvoyées par la requête de test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part UPDATE dbo.T_TEST SET val = '0' WHERE dbo.T_TEST.id <=10000
# Pour imposer 2% du nombre total de lignes renvoyées par la requête de test :
Et ainsi de suite ....
Code : Sélectionner tout - Visualiser dans une fenêtre à part UPDATE dbo.T_TEST SET val = '0' WHERE dbo.T_TEST.id <=20000
Voici les résultats obtenus:
Pour SQL SERVER 2008 R2
=========================
--> 0% -7% ==> INDEX SEEK
--> 8% -100% ==> TABLE SCAN
Pour SQL SERVER 2005 SP3
=========================
--> 0% -7% ==> INDEX SEEK
--> 8% -100% ==> TABLE SCAN
Généralement la limite de sélectivité d'un index non cluster est entre 0% - 5% du nombre du nombre total de lignes de la table !?
Question :
Comment expliquer la différence observée (0-7% au lieu de 0-5%) dans mon exemple ?
Merci de m'éclairer
Partager