SQL Server喜欢%%的语句行为

时间:2010-09-16 20:47:58

标签: sql sql-server where-clause sql-like

就性能而言,like运算符在应用于具有多个%占位符的字符串时的行为如何?

例如:

select A from table_A where A like 'A%' 

选择的时间与

相同
select A from table_A where A like 'A%%' 

???

3 个答案:

答案 0 :(得分:8)

您的疑问:

select A from table_A where A like 'A%' 

select A from table_A where A like 'A%%'
                                      ^ optimizer will remove second redundant %

是等效的,优化器将删除第二个查询中的第二个%

就像它会删除1=1

select A from table_A where A like 'A%%' and 1=1

但是,这个查询非常不同:

select A from table_A where A like '%A%' 

使用'A%'时,它会使用索引查找以A开头的所有内容,就像使用电话簿的人会快速查找名称的开头一样。但是,当使用'%A%'时,它将扫描整个表,查找包含A的任何内容,因此速度较慢且没有索引使用。就像你必须在电话簿中找到包含A的每个名字一样,这需要一段时间!

答案 1 :(得分:1)

它会对待它们。如果列A上有索引,它将使用该索引,就像使用单个通配符一样。但是,如果要添加前导通配符,则无论是否存在索引,都会强制进行表扫描。

答案 2 :(得分:0)

在大多数情况下,您使用的模式不会影响查询的性能。性能的关键是适当使用索引。在您的示例中,列上的索引将运行良好,因为它将搜索以“A”开头的值,然后匹配完整模式。可能存在一些更具挑战性的模式,但它们之间的性能差异可以忽略不计。

有一个重要条件,通配符会损害性能。并且,就在它处于模式的开头时。例如,'%A'不会从索引中获益,因为它表示您希望匹配以任何有效字符开头的任何值。必须评估所有行以满足此条件。