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 № 1Tout 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):
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):