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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top