Index Non Cluster - Niveau de sélectivité
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:
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 :
Code:
SELECT * FROM dbo.T_TEST WHERE val = '0'
-- Requête pour imposer le % de lignes renvoyées par la requête :
# Pour imposer 1% du nombre total de lignes renvoyées par la requête de test :
Code:
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 :
Code:
UPDATE dbo.T_TEST SET val = '0' WHERE dbo.T_TEST.id <=20000
Et ainsi de suite ....
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