在使用Linq to SQL的MVC应用程序中,我有许多页面允许按其真实姓名,电子邮件(以及其他一些字段)过滤用户。用户的名字,姓氏和所有额外字段存储在单独的列中。现在,用户表没有索引(除了用户ID的聚集索引)。
Linq在where部分中生成一个具有(或多或少)此查询的查询:
(firstName + " " + lastName) LIKE @searchTerm OR
(lastName + " " + firstName) LIKE @searchTerm
如果我要编制索引,那会是一个好方法吗?
我在考虑:
(firstName,lastName)
和(lastName,firstName)
firstName
上添加索引,在lastName
SQL Server是否会实际使用(firstName + " " + lastName) LIKE @searchTerm
搜索中第一个示例中的索引?
如果我有更多时间,我会尝试自己进行一些测试,但也许有人已经不得不解决类似的问题了?
onskee提出的解决方案让我想起了另一个在使用其他人制作的数据库时遇到过的问题。它涉及添加一个计算列,其中包含用户名的所有组合(名字优先,姓氏优先等)和其他应该可搜索的列,并在此计算列上添加全文索引。我不确定它有多有效,我想我也必须测试它。
答案 0 :(得分:1)
添加包含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