/ / SQL Server peut-il utiliser plusieurs index? - serveur SQL, serveur SQL 2008, indexation

SQL Server peut-il utiliser plusieurs index? - sql-server, sql-server-2008, indexation

IMHO SQL Server peut choisir lui-même (sauf indication contraire) quel est le meilleur index à utiliser pour la requête.

D'accord

Qu'en est-il quelque chose comme ceci (pseudo-code):

select __a from tbl where __a not in
(
select __b  from tbl

)

(disons que nous avons index_1 qui est pour (__a) et index_2 qui est pour (__b)

SQL Server utilisera-t-il toujours un index à l'exécution ou plusieurs index ensemble ...?

Réponses:

6 pour la réponse № 1

Tout d'abord, créez vos tables:

USE tempdb;
GO
CREATE TABLE dbo.tbl(__a INT, __b INT);

Puis créez deux index:

CREATE INDEX a_index ON dbo.tbl(__a);
CREATE INDEX b_index ON dbo.tbl(__b);

Maintenant peupler avec quelques données:

INSERT dbo.tbl(__a, __b)
SELECT [object_id], column_id
FROM sys.all_columns;

Maintenant, lancez votre requête et transformez le plan d'exécution réelsur. Vous verrez quelque chose comme ceci, montrant que, oui, les deux index sont utilisés (en fait, l'index sur __b est utilisé à la fois pour l'extraction de données dans la sous-requête et pour tenter d'éliminer les lignes):

entrer la description de l'image ici

Un moyen plus efficace d'écrire votre requête serait:

select __a from dbo.tbl AS t where not exists
(
select 1 from dbo.tbl AS t2
where t2.__b = t.__a
);

Maintenant, voici votre plan complet (encore une fois, les deux index sont utilisés, mais remarquez comme il y a beaucoup moins d'opérations):

entrer la description de l'image ici