like子句开头的%

bal*_*hmi 4 sql t-sql sql-server

我听说由于性能原因,不建议在SQL Server的LIKE子句的开头使用%.为什么会这样?

有关此问题的更多详细信息将有助于我了解此问题的影响.

cha*_*aos 13

一个%在年初LIKE条款意味着索引是完全无用的.如果有静态文本将模式锚定在前面%,则至少可以从索引中获取潜在的实用程序.

  • 关键词是"sargable" (4认同)

Ant*_*lev 5

%foo基本上说"所有字符串以'foo'结尾".为了过滤掉那些,SQL服务器必须扫描所有表(在最坏的情况下)并检查每个字符串.这就是它如此昂贵的原因.


KM.*_*KM. 5

为什么喜欢'%......'不好?你不能使用任何索引,必须扫描整个表.

这是一个很好的例子:

转到电话簿,找到符合'%ch'的所有名字.这将花费很长时间,因为您无法使用聚集索引,并且必须扫描整本书!

鉴于数据'abcdefg'

WHERE Column1 LIKE '%cde%'  --can't use an index

WHERE Column1 LIKE 'abc%' --can use and index

WHERE Column1 Like '%defg' --can't use an index, but see note below
Run Code Online (Sandbox Code Playgroud)

注意:如果您有需要'%defg'的重要查询,则可以使用持久计算列来REVERSE()列,然后对其进行索引.然后你可以查询:

WHERE Column1Reverse Like REVERSE('defg')+'%' --can use the persistent computed column's index
Run Code Online (Sandbox Code Playgroud)

要添加一个持久的计算列(反转字符串)并对其进行索引,请使用以下代码:

ALTER TABLE YourTable ADD ReversedYourString  AS REVERSE(YourString) PERSISTED 

CREATE NONCLUSTERED INDEX IX_YourTable_ReversedYourString 
ON YourTable (ReversedYourString) 
Run Code Online (Sandbox Code Playgroud)