我听说它不建议在LIKE子句的SQL Server中的使用开始%,由于业绩reasons.Why是,这是这样的吗?
在此方面的详细信息,会帮助我理解这个问题的影响。
我听说它不建议在LIKE子句的SQL Server中的使用开始%,由于业绩reasons.Why是,这是这样的吗?
在此方面的详细信息,会帮助我理解这个问题的影响。
一%
在年初LIKE
子句的意思是索引是完全无用的。 如果静态文本的前锚定图案%
,有至少从索引而获得的潜在效用。
%foo
基本上说“的所有字符串与‘富’结束”。 为了过滤掉那些,SQL服务器扫描所有表(在最坏的情况下),并检查每一个字符串。 这就是为什么它是如此昂贵。
为什么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)
有它的任何地方将增加一个性能负担,因为有一个在文本字段的内容没有索引。
有了它在一开始,它做在最坏的情况下搜索到文本字段的末尾。
如果您在您的从句的开头都有%,查询引擎无法生成使用索引,但必须进行表扫描查询计划。
很多人都解释了为什么COL1 LIKE“%...”是坏的。
这里有一个潜在的解决方法,如果你碰到这种情况很多:
我们用它来搜索VIN(车辆识别号码)或SocialSecurity号码的最后一位数字和它的工作太棒了! 性能的提高太棒了
全表扫描
什么数据库管理员最害怕的;)
由于搜索不能由索引被加速,服务器必须通过在该表(=表扫描)每个记录循环,并检查是否在记录LIKE表达式匹配。
这可能不是小表有问题,但肯定是有很多的行较大的表,因为所有记录都必须从磁盘获取。
这是相对于索引扫描,其中,所述搜索标准允许服务器使用索引来限制搜索到(理想地)小的记录集。