Sélectionne sur des sous-ensembles SQL
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.
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.