在一个使用Linq to SQL的MVC应用程序中,我有许多页面可以根据用户的真实姓名、电子邮件(和其他一些字段)过滤用户。用户的名字、姓氏和所有额外的字段都存储在单独的列中。现在,用户表没有索引(除了用户id上的聚集索引之外)。
Linq生成一个查询,该查询在where部分(或多或少)包含以下内容:
(firstName + " " + lastName) LIKE @searchTerm OR
(lastName + " " + firstName) LIKE @searchTerm
如果我把它编入索引,什么是好方法?
我在想:
- 添加2个复索引
(firstName,lastName)
和(lastName,firstName)
- 在
firstName
上添加索引,在lastName
上添加另一个索引 - 还有别的吗
SQL Server真的会在(firstName + " " + lastName) LIKE @searchTerm
搜索中使用第一个示例中的索引吗?
当我有更多的时间时,我会尝试自己进行一些测试,但也许有人已经解决了类似的问题?
onskee提出的解决方案让我想起了另一个我在处理别人制作的数据库时遇到过几次的解决方案。它包括添加一个由用户名(名字第一、姓氏第一等)和其他应该可搜索的列的所有组合组成的计算列,并在该计算列上添加全文索引。我不确定它有多有效,我想我也得测试一下。
添加一个包含FirstName和LastName的计算列,然后添加一个索引怎么样?我还没有测试性能,但这是一种尝试方法。
ALTER TABLE dbo.Users ADD FullName AS FirstName + ' ' + LastName
GO
CREATE NONCLUSTERED INDEX IX_FullName ON dbo.Users
(
FullName
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO