Question

Je dois vérifier si une ligne existe dans une base de données; cependant, je suis en train de trouver le moyen de faire ce qui offre les meilleures performances. Ceci est bien résumé par un exemple.

Supposons que je le tableau suivant:

dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)

Supposons que ce tableau a des millions de lignes, mais seulement la Company colonne a un index.

Je veux savoir si une combinaison particulière de FirstName, LastName et Company existe. Je sais que je peux faire ceci:

IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End

Cependant, à moins que je ne me trompe pas, qui fera une analyse complète de la table.

Ce que je voudrais vraiment à faire est une requête où il utilise l'index. Avec le tableau ci-dessus, je sais que la requête suivante aura une grande performance, car il utilise l'index:

Select * from dbo.Person where Company = @Company

Y at-il de toute façon de faire la recherche uniquement sur ce sous-ensemble de données? par exemple. quelque chose comme ceci:

select * from (
  Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName

De cette façon, il ne serait en train de faire une analyse de table sur une collection beaucoup plus étroite de données.

Je sais que la question ci-dessus ne fonctionnera pas, mais est-il une requête qui?

Oh, et je suis incapable de créer des tables temporaires, car l'utilisateur n'aura accès en lecture.

Était-ce utile?

La solution

IF EXISTS( ...) est la forme la plus rapide. L'Optimiseur utilisera un index disponible pour satisfaire la condition de filtre si elle calcule l'indice sera plus rapide. IF EXISTS quittera dès qu'une ligne se trouve.

Assurez-vous que vos statistiques sont à jour ...

Autres conseils

FWIW, ceci est SQL valide:

select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName

Et ne diffère de votre requête par un alias. Le IF EXISTS sera plus rapide que Mitch dit dans son poste.

Vous pouvez utiliser l'analyseur de requête pour savoir ce que l'optimiseur décide de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top