%在类似条款的开始(% in the beginning of like clause)

2019-07-21 11:18发布

我听说它不建议在LIKE子句的SQL Server中的使用开始%,由于业绩reasons.Why是,这是这样的吗?

在此方面的详细信息,会帮助我理解这个问题的影响。

Answer 1:

%在年初LIKE子句的意思是索引是完全无用的。 如果静态文本的前锚定图案% ,有至少从索引而获得的潜在效用。



Answer 2:

%foo基本上说“的所有字符串与‘富’结束”。 为了过滤掉那些,SQL服务器扫描所有表(在最坏的情况下),并检查每一个字符串。 这就是为什么它是如此昂贵。



Answer 3:

为什么LIKE“%...”不是很好吗? 你不能使用任何索引,并且必须扫描整个表。

这里是一个很好的例子:

进入电话簿,找到我与“%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

注:如果您有需要“%DEFG”重要问题,你可以使用,你扭转持续计算列()列,然后建立索引。 你就可以查询在:

WHERE Column1Reverse Like REVERSE('defg')+'%' --can use the persistent computed column's index

在其上添加一个持久计算列(即反转字符串)和索引,使用以下代码:

ALTER TABLE YourTable ADD ReversedYourString  AS REVERSE(YourString) PERSISTED 

CREATE NONCLUSTERED INDEX IX_YourTable_ReversedYourString 
ON YourTable (ReversedYourString) 


Answer 4:

有它的任何地方将增加一个性能负担,因为有一个在文本字段的内容没有索引。

有了它在一开始,它做在最坏的情况下搜索到文本字段的末尾。



Answer 5:

如果您在您的从句的开头都有%,查询引擎无法生成使用索引,但必须进行表扫描查询计划。



Answer 6:

很多人都解释了为什么COL1 LIKE“%...”是坏的。

这里有一个潜在的解决方法,如果你碰到这种情况很多:

  • 创建另一列说COL2
  • 写在COL1的插入/更新的触发器,填补COL2与COL1“倒退”
  • 创建COL2索引
  • 如果您的应用程序搜索像COL1“%......”,搜索像COL2“......%”,而不是(或者甚至SUBSTR(COL1等)=“...” [原谅我的预言方言]

我们用它来搜索VIN(车辆识别号码)或SocialSecurity号码的最后一位数字和它的工作太棒了! 性能的提高太棒了



Answer 7:

全表扫描

什么数据库管理员最害怕的;)

由于搜索不能由索引被加速,服务器必须通过在该表(=表扫描)每个记录循环,并检查是否在记录LIKE表达式匹配。

这可能不是小表有问题,但肯定是有很多的行较大的表,因为所有记录都必须从磁盘获取。

这是相对于索引扫描,其中,所述搜索标准允许服务器使用索引来限制搜索到(理想地)小的记录集。



文章来源: % in the beginning of like clause