创建LIKE过滤器时(我做的是StartsWith逻辑,而不是Contains)我是否需要对索引执行任何特殊操作,或者只创建标准的非聚簇索引?
查询:
SELECT * FROM Contact WHERE AccountUID = @AccountUID AND (FirstName LIKE @Filter + '%' OR LastName LIKE @Filter + '%' OR Company LIKE @Filter + '%')
拟议指数:
CREATE NONCLUSTERED INDEX [ix_Contact_Search] ON [dbo].[Contact]
(
[AccountUID] ASC,
[FirstName] ASC,
[LastName] ASC,
[Company] ASC
)
答案 0 :(得分:1)
不,你的索引没什么特别的。你在那里列出的索引看起来会完美支持你的查询。
这可能超出了你的问题的范围,但这里有一点了解索引和通配符。只要您的搜索谓词(您在where子句中比较的值)是已知值,您就可以使用索引。在你的样本中,你说like @filter + '%'
这样就完全可以,因为它评估为(比方说)“你好”+任何东西。索引中的记录看起来(再次,通过示例)“Hello World”,因此它可以寻求权利。
如果您使用通配符(例如'%' + @filter + '%'
)启动搜索谓词,则可以使用索引。现在你有一个问题,因为你的字符串可能是“AardvarkHello”或“ZebraHello”,它不知道在哪里看。