web-dev-qa-db-fra.com

SQL Server peut-il utiliser plusieurs index pour la même requête?

Cette question a peut-être été posée auparavant, mais j'ai essayé de rechercher avec ce terme "SQL Server peut-il utiliser deux index pour la même requête" et il n'a donné aucun résultat.

Supposons que vous ayez la requête ci-dessous:

select col1a,colb
from #ab
where col1a in (
Select col1a from #ab 
group by col1a 
having count (distinct colb)>1)

Et vous avez l'indice ci-dessous:

create index nci on #ab(colb)
include(col1a)

Ceci est le plan d'exécution, et Coller le lien Plan également.

NUTS

La partie inférieure du plan correspond à la requête ci-dessous:

Select col1a from #ab 
group by col1a 
having count (distinct colb)>1

La table scan/partie supérieure du plan est pour la requête ci-dessous:

select col1a,colb
from #ab
where col1a in (

Question:

Si j'ai un index comme ci-dessous:

create index nic_toppart on #ab(Col1a,colb)

Sera-t-il choisi pour la partie supérieure du plan?

En résumé, je voulais dire:

SQL Server peut-il utiliser l'index nci pour regrouper la partie/partie inférieure du plan et utiliser l'index nic_toppart pour la partie supérieure du plan

Est-ce possible?

Mes tests montrent qu'il ne peut en choisir qu'un.

Voici les données de test. Veuillez me faire savoir si je ne suis pas clair.

create table #ab
(
col1a int,
colb char(2)
)

insert into #ab
values
(1,'a'),
(1,'a'),
(1,'a'),
(2,'b'),
(2,'c'),
(2,'c')

select col1a,colb
from #ab
where col1a in (
Select col1a from #ab 
group by col1a 
having count (distinct colb)>1)


create index nci on #ab(colb)
include(col1a)

create index nci_p on #ab(col1a,colb)
5
TheGameiswar

Oui, mais pas avec les index que vous avez choisis.

Si je crée ces index:

CREATE INDEX ix_top ON #ab (col1a) INCLUDE (colb);

CREATE INDEX ix_bottom ON #ab (colb, col1a);

Je reviens ce plan :

NUTS

Et c'est sans avoir à utiliser plusieurs indices d'index .

Avec un indice légèrement différent:

CREATE INDEX ix_mindyourbusinessypercube ON #ab (col1a, colb);

Le plan change pour n'utiliser que cet index, bien que les ramifications des performances soient difficiles à supposer étant donné les données de test limitées. Je laisse cela comme un exercice pour ypercube le lecteur.

NUTS

9
Erik Darling