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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top