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.
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)
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 :
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.