Sql server 类似SQL Server的语句问题

Sql server 类似SQL Server的语句问题,sql-server,tsql,pattern-matching,Sql Server,Tsql,Pattern Matching,我正在使用SQLServer2008企业版。现在我有两个模式来实现相同的功能(为了查看zoo1、zoo2或zoo3列是否包含一些文本,在模式1中,我合并了zoo1、zoo2和zoo3的内容以形成一个名为zoo的新列),我认为从我的实验来看,第一个模式的性能总是更好(我做了一些实验)。但是我不确定我是否正确,模式1总是表现更好的内在原因是什么 模式1: Select foo, goo from tablefoo where zoo like LIKE '%'+@Query+'%' 模式2(zoo

我正在使用SQLServer2008企业版。现在我有两个模式来实现相同的功能(为了查看zoo1、zoo2或zoo3列是否包含一些文本,在模式1中,我合并了zoo1、zoo2和zoo3的内容以形成一个名为zoo的新列),我认为从我的实验来看,第一个模式的性能总是更好(我做了一些实验)。但是我不确定我是否正确,模式1总是表现更好的内在原因是什么

模式1:

Select foo, goo from tablefoo where zoo like LIKE '%'+@Query+'%'
模式2(zoo是我合并zoo1、zoo2和zoo3列内容生成的列):

提前感谢,,
乔治

或几乎总是扼杀表演

在这种情况下,需要扫描3列,而需要扫描1列

在这两种情况下,由于您有一个前导的%,因此无论如何都不会使用索引(它可能是扫描的,因为它覆盖了zoo%列)


1列只比3列或查询差。不是“更好”。

您如何构建组合列,
zoo
?您是否正在使用视图,如果是,是否对其进行索引?您使用的是计算列吗?如果是,它是否持久化?顺便说一句,您的查询可能容易受到SQL注入攻击。本周我已经回答了一个类似的问题SQL索引几乎都会与查询或a、b或c相冲突最好是联合和分离queries@Daniel它在什么方面容易受到Sql注入的攻击?@Denis:现在我再看一眼,我没有发现Sql注入的问题;正如我确信您所发现的,没有办法“突破”像子句模式valueChanged标记那样的
:适用于所有SQL Server所以,结论是使用no或有一点改进?@George:在这种情况下,是的。在其他情况下,使用前导%可能会更好,为什么不使用索引?@George:索引按键值排序,索引查找利用排序序列查找数据。例如,如果“Zoo%”大于“M”,SQL Server不必查看小于或等于“M”的值。通过输入前导字符%,您告诉SQL Server查找以“a”或“Z”开头的值或任何有效字符。SQL Server必须检查所有值,这会破坏索引的优势。
Select foo, goo from tablefoo where (zoo1 like LIKE '%'+@Query+'%') OR (zoo2 like LIKE '%'+@Query+'%') or (zoo3 like LIKE '%'+@Query+'%')