Index SQL Server sur plusieurs filters "LIKE @filter + '%'"

Lors de la création de filters LIKE (je fais la logique StartsWith, pas Contient) dois-je faire quelque chose de spécial avec les index, ou simplement créer un index non clusterisé standard?

Question:

SELECT * FROM Contact WHERE AccountUID = @AccountUID AND (FirstName LIKE @Filter + '%' OR LastName LIKE @Filter + '%' OR Company LIKE @Filter + '%') 

Index proposé:

 CREATE NONCLUSTERED INDEX [ix_Contact_Search] ON [dbo].[Contact] ( [AccountUID] ASC, [FirstName] ASC, [LastName] ASC, [Company] ASC ) 

Non, il n'y a rien de spécial à faire avec votre index. L'index que vous avez mis là-bas semble soutenir votre requête parfaitement.

Cela dépasse probablement le cadre de votre question, mais voici quelques informations sur les index et les caractères generics. Tant que votre prédicat de search (la valeur que vous comparez dans votre clause where) est une valeur connue, vous pouvez utiliser un index. Dans votre exemple, vous dites like @filter + '%' alors c'est parfaitement correct, car il évalue à (disons) "Bonjour" + n'importe quoi. L'logging dans l'index ressemble (encore, par exemple) "Hello World", donc il peut chercher juste.

Vous pouvez cependant utiliser un index si vous commencez votre prédicat de search avec un caractère générique par exemple '%' + @filter + '%' . Maintenant, vous avez un problème car votre string pourrait être "AardvarkHello" ou "ZebraHello" et elle n'a aucune idée de l'endroit où regarder.