Essa pergunta pode ter sido feita antes, mas tentei pesquisar com este termo "o SQL Server pode usar dois índices para a mesma consulta" e não obteve resultados.
Suponha que você tenha a consulta abaixo:
select col1a,colb
from #ab
where col1a in (
Select col1a from #ab
group by col1a
having count (distinct colb)>1)
E você tem o índice abaixo:
create index nci on #ab(colb)
include(col1a)
Este é o plano de execução e também o link Colar o Plano .
A parte inferior do plano é para a consulta abaixo:
Select col1a from #ab
group by col1a
having count (distinct colb)>1
A verificação da tabela/parte superior do plano é para a consulta abaixo:
select col1a,colb
from #ab
where col1a in (
Pergunta:
Se eu tiver um índice como abaixo:
create index nic_toppart on #ab(Col1a,colb)
Será escolhido para a parte superior do plano?
Resumindo eu quis dizer:
O SQL Server pode usar o índice nci
para agrupar parte/parte inferior do plano e usar o índice nic_toppart
para a parte superior do plano
Isso é possível?
Meus testes mostram que só pode escolher um.
Abaixo estão os dados de teste. Por favor, deixe-me saber se eu não sou claro.
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)
Sim, mas não com os índices que você escolheu.
Se eu criar esses índices:
Recebo este plano :
E isso sem ter que usar várias dicas de índice .
Com um índice ligeiramente diferente:
O plano muda para usar apenas esse índice, embora as ramificações de desempenho sejam difíceis de supor, devido aos dados de teste limitados. Deixo isso como exercício para
ypercuboo leitor.