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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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