J'ai une requête de recherche dont j'hérite et que j'essaie d'optimiser. Je suis curieux d'entendre si quelqu'un a des meilleures pratiques et des recommandations pour un tel. Le serveur de production est toujours SQL Server 2000 également. La requête est une procédure stockée de recherche client avancée qui accepte 5 paramètres de critères de recherche différents (par exemple, prénom, nom, adresse, téléphone, etc.) pour rechercher une table d'enregistrements multimilliards. Il y a des index sur toutes les colonnes et colonnes jointes dans la clause WHERE. En outre, la requête initiale vide les enregistrements dans une variable de table pour la capacité de pagination.Quelles sont les meilleures pratiques pour optimiser plusieurs requêtes SQL LIKE à colonnes?
INSERT INTO @tempCustTable (CustomerID, FirstName, LastName, City, StateProvince, Zip, PhoneNumber)
SELECT DISTINCT cu.CustomerID, cu.FirstName, cu.LastName, a.City,
a.StateProvince, a.Zip, p.PhoneNumber
FROM Customer cu WITH(NOLOCK)
LEFT OUTER JOIN Address a WITH(NOLOCK) ON cu.CustomerID = a.CustomerID
LEFT OUTER JOIN Phone p WITH(NOLOCK) ON cu.CustomerID = p.CustomerID
WHERE (cu.LastName = @LastName OR cu.LastName LIKE @LastName + '%')
AND (@FirstName IS NULL OR cu.FirstName = @FirstName OR cu.FirstName LIKE @FirstName + '%')
AND (@StateProvince = '' OR a.StateProvince LIKE @StateProvince)
AND (@City = '' OR a.City LIKE @City + '%')
AND (@Zip = '' OR a.Zip = @Zip OR a.Zip LIKE @Zip + '%')
ORDER BY cu.LastName, cu.FirstName
Quelqu'un at-il des recommandations sur la façon dont je pourrais améliorer les performances de la requête?
Bonne question. J'ai besoin de regarder SQL OU à nouveau pour voir si elle évalue les deux côtés indépendamment du retour du côté gauche. – JamesEggers
Il y a une différence en fait ce @Zip = '' retournera aussi des valeurs NULL dans a.Zip c'est ce que vous voulez? – SQLMenace
L'adresse @ City/@ State/@ Zip IS NULL ou la logique vide est adressée et modifiée avant la requête dans la question, donc @Zip = '' est valide. – JamesEggers