Pergunta
Preciso verificar se existe uma linha em um banco de dados; No entanto, estou tentando encontrar a maneira de fazer isso que oferece o melhor desempenho. Isso é melhor resumido com um exemplo.
Vamos supor que eu tenha a tabela a seguir:
dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)
Suponha que esta tabela tenha milhões de linhas, no entanto, apenas a coluna Company
tem um índice.
Eu quero descobrir se uma combinação particular de FirstName
, LastName
e Company
existe. Eu sei que posso fazer isso:
IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End
No entanto, a menos que eu esteja enganado, isso fará uma varredura completa.
O que eu realmente gostaria que fosse fazer é uma consulta em que utiliza o índice. Com a tabela acima, eu sei que a consulta a seguir terá um ótimo desempenho, pois usa o índice:
Select * from dbo.Person where Company = @Company
Existe alguma maneira de fazer a pesquisa apenas nesse subconjunto de dados? por exemplo, algo assim:
select * from (
Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName
Dessa forma, seria apenas uma varredura de tabela em uma coleção muito mais estreita de dados.
Eu sei que a consulta acima não funcionará, mas há uma consulta que iria?
Ah, e não consigo criar tabelas temporárias, pois o usuário só terá acesso de leitura.
Solução
IF EXISTS( ...)
é a forma mais rápida. O otimizador usará um índice disponível para satisfazer a condição do filtro se calcular o índice será mais rápido. IF EXISTS
desistirá assim que uma linha for encontrada.
Verifique se suas estatísticas estão atualizadas ...
Outras dicas
FWIW, este é o SQL válido:
select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName
E difere da sua consulta por um pseudônimo. o IF EXISTS
será mais rápido, como Mitch diz em seu posto.
Você pode usar o analisador de consulta para descobrir o que o otimizador decidirá fazer.