Domanda
Ho bisogno di verificare se esiste una riga in un database; tuttavia, sto cercando di trovare il modo per farlo che offre le migliori prestazioni. Questo è meglio riassumere con un esempio.
Supponiamo che io ho la seguente tabella:
dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)
Si supponga questa tabella ha milioni di righe, ma solo il Company
colonna ha un indice.
Voglio scoprire se una particolare combinazione di FirstName
, LastName
e Company
esiste. So che posso fare questo:
IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End
Tuttavia, se non mi sbaglio, che farà una scansione completa della tabella.
Quello che mi piace fare è una query in cui si utilizza l'indice. Con la tabella di cui sopra, so che la seguente query avrà grande prestazione, dal momento che utilizza l'indice:
Select * from dbo.Person where Company = @Company
Esiste un modo per rendere la ricerca solo su tale sottoinsieme di dati? per esempio. qualcosa di simile a questo:
select * from (
Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName
In questo modo, avrebbe fatto solo una scansione di tabella su una collezione più stretto gran parte dei dati.
So che la query di cui sopra non funziona, ma c'è una domanda che farebbe?
Oh, e sono in grado di creare tabelle temporanee, come l'utente avrà solo l'accesso in lettura.
Soluzione
IF EXISTS( ...)
è la forma più veloce. L'ottimizzatore utilizzerà un indice disponibile per soddisfare la condizione di filtro se calcola l'indice sarà più veloce. IF EXISTS
si chiuderà non appena una riga viene trovato.
Assicurarsi che le statistiche sono aggiornate ...
Altri suggerimenti
FWIW, questo è SQL valida:
select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName
E solo differisce dalla vostra richiesta per un alias. Il IF EXISTS
sarà più veloce, come dice Mitch nel suo post.
È possibile utilizzare l'analizzatore di query per scoprire che cosa l'ottimizzatore deciderà di fare.