IMHO SQL Server pode escolher a si mesmo (a menos que seja dito) o que é o melhor índice a ser usado para a consulta.
Está bem
E algo parecido com isto (pseudo código):
select __a from tbl where __a not in
(
select __b from tbl
)
(digamos que temos index_1
que é para (__a)
e index_2
que é para (__b)
O SQL Server ainda usará 1 índice em execução ou vários índices juntos ...?
Respostas:
6 para resposta № 1Primeiro, crie suas tabelas:
USE tempdb;
GO
CREATE TABLE dbo.tbl(__a INT, __b INT);
Em seguida, crie dois índices:
CREATE INDEX a_index ON dbo.tbl(__a);
CREATE INDEX b_index ON dbo.tbl(__b);
Agora preencha com alguns dados:
INSERT dbo.tbl(__a, __b)
SELECT [object_id], column_id
FROM sys.all_columns;
Agora execute sua consulta e gire o plano de execução realem. Você verá algo assim, mostrando que sim, ambos os índices são usados (na verdade, o índice em __b é usado para recuperação de dados na subconsulta e como uma tentativa de eliminar linhas):
Uma maneira mais eficiente de escrever sua consulta seria:
select __a from dbo.tbl AS t where not exists
(
select 1 from dbo.tbl AS t2
where t2.__b = t.__a
);
Agora aqui está todo o seu plano (novamente, ambos os índices são usados, mas observe como há muito menos operações):