Sql server 存储过程-跨多个列搜索参数

Sql server 存储过程-跨多个列搜索参数,sql-server,sql-server-2016,Sql Server,Sql Server 2016,我有下面的查询可以很好地完成这项工作,但是我想知道在WHERE子句中是否有更好的方法来完成这项工作 如有任何改进意见/反馈,将不胜感激 SELECT C.ClientID, C.FirstName + ' ' + C.LastName as FullName, C.DOB, G.Gender, G.GenderIcon, C.VerificationCode, MAX(V.StartDate) as LastVisitDate F

我有下面的查询可以很好地完成这项工作,但是我想知道在
WHERE
子句中是否有更好的方法来完成这项工作

如有任何改进意见/反馈,将不胜感激

SELECT
    C.ClientID, 
    C.FirstName + ' ' + C.LastName as FullName, 
    C.DOB,
    G.Gender, 
    G.GenderIcon, 
    C.VerificationCode, 
    MAX(V.StartDate) as LastVisitDate
FROM 
    Client C
LEFT JOIN 
    Visit V ON C.ClientID = V.ClientID
INNER JOIN 
    Gender G ON C.GenderID = G.GenderID
WHERE
    (FirstName like '%' + @Criteria + '%' or
     LastName like '%' + @Criteria + '%' or
     VerificationCode like '%' + @Criteria + '%')

除了查看全文搜索之类的内容外,没有。如果一列比其他列更可能包含匹配项,并且您有覆盖索引,那么您可以使用三个查询并分别运行它们,但是如果您返回的列是表扫描,那么它们很可能都涉及表扫描。您也可以首先考虑查询“代码>,如@标准+”%'/COD>,因为它可以使用索引来支持有效的范围扫描(在任何情况下都比读取所有行更有效)。然而,这些都不能改善最坏的情况

除了查看全文搜索之类的内容之外,没有。如果一列比其他列更可能包含匹配项,并且您有覆盖索引,那么您可以使用三个查询并分别运行它们,但是如果您返回的列都可能涉及表扫描。您也可以首先考虑查询“代码>,如@标准+”%'/COD>,因为它可以使用索引来支持有效的范围扫描(在任何情况下都比读取所有行更有效)。然而,这些都不能改善最坏的情况

@Jeroenmoster为什么不写下这个作为答案。。。这个问题没有更多的答案了!!谢谢@Jeroenmoster,感谢您的回复。正如哈迪所说,请随意将此作为一个答案发布,我会接受。可能还有其他答案,但你是对的,它不应该是一个评论。@Jeroenmoster为什么不将此作为一个答案写下来。。。这个问题没有更多的答案了!!谢谢@Jeroenmoster,感谢您的回复。正如哈迪所说,请随意将此作为答案发布,我会接受。可能还有其他答案,但你是对的,它不应该是评论。我想你的意思是索引范围扫描。因为“%”通配符将执行范围扫描。搜索查找固定的已知值,而
%
可能具有/匹配
@Criteria
@RaduGheorghiu的多个结尾:如果列上有索引,则将使用索引搜索运算符跳转到范围中的第一行。剩下的部分是扫描的,你说得很对,但这与实际的索引扫描操作符不同。我想这是一个术语问题——我使用的是引擎本身使用的名称。事实上,非常准确地说,它生成的是一个逻辑索引查找运算符,它使用物理索引扫描。。。还不是特别清楚。我会修改我的答案,这样就不会混淆我的意思。我想你指的是索引范围扫描。因为“%”通配符将执行范围扫描。搜索查找固定的已知值,而
%
可能具有/匹配
@Criteria
@RaduGheorghiu的多个结尾:如果列上有索引,则将使用索引搜索运算符跳转到范围中的第一行。剩下的部分是扫描的,你说得很对,但这与实际的索引扫描操作符不同。我想这是一个术语问题——我使用的是引擎本身使用的名称。事实上,非常准确地说,它生成的是一个逻辑索引查找运算符,它使用物理索引扫描。。。还不是特别清楚。我会修改我的答案,这样就不会对我的意思产生混淆。