回答
A %
在LIKE
子句的开头表示索引完全没用。如果有静态文本将模式锚定在%
之前,至少可以从索引中获得潜在效用。
将它放在任何位置都会增加性能,因为没有关于文本字段内容的索引。
在开始时,它必须在最差的情况下搜索到文本字段的末尾。
如果字段的开头是固定的,则某些(可能是大多数)数据库引擎将使用索引。就像搜索“Abc%”一样,它可以使用索引查找第一个“Abc”,然后从那里按顺序搜索。但是,当字符串以“%”开头时...查看所有其他答案。 – Jay 2009-10-08 13:29:02
%foo
基本上说“所有以'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)
全表扫描
DBA最害怕的是什么;)
由于搜索无法通过索引加速,因此服务器必须遍历表中的每条记录(=表扫描)并检查记录是否与LIKE表达式匹配。
这对于小型表格可能不是问题,但对于有大量行的大型表格肯定会有问题,因为所有记录都必须从磁盘中提取。
这与索引扫描相反,在索引扫描中,搜索条件允许服务器使用索引将搜索限制在(理想情况下)较小的一组记录中。
很多人解释了为什么col1像'%...'一样糟糕。
这里有一个潜在的解决方法,如果你碰到这种情况很多:
- 创建另一列说COL2
- 写在插入触发/ COL1的更新填充COL2与COL1“倒退”
- 在col2上创建索引
- 如果您的应用程序必须搜索col1(如'%...'),则搜索col2(如'...%')而不是(甚至是substr(col1等)=')。 ..'[原谅我的oracle方言]
我们正在使用它来搜索VIN(车辆识别号码)或社会安全号码的最后几位,它效果很好!性能改进非常好
忘记使用触发器,使用计算列效率更高。您只需要REVERSE()原始值,您可以使用我答案中的示例代码搜索它。 – 2009-10-08 13:57:59
计算列似乎是特定于SQLServer的,它当然是一个不错的和优雅的解决方案。如前所述,我更像是一名Oracle人员。 – Thorsten 2009-10-08 18:12:56
- 1. DB2 Over clause问题
- 2. group by clause
- 3. SQL GROUP BY CLAUSE
- 4. Cakehp Acl'Aro0.foreignKey'in'where clause''
- 5. mysql select distinct clause
- 6. group by clause help
- 7. php mysql where clause
- 8. SQLite where clause
- 9. “where in”mysql clause
- 10. 与Netezza公司CLAUSE
- 11. Linq to Entities Distinct Clause
- 12. Pycassa col_fam.get_indexed_slices(clause)Whats wrong
- 13. max-count in having-clause
- 14. PHP Multiarray LOOP WHERE CLAUSE
- 15. MySQL LEFT JOIN .. ON .. CLAUSE
- 16. Pyrocms,stream on where clause
- 17. 对DB2 SQL结果按WHERE CLAUSE排序
- 18. 如何编写(union in optional clause)或(optionals with union clause)?例如
- 19. MySQL where where clause with microseconds
- 20. 'having clause'中的未知列:
- 21. 通过“In clause”排序
- 22. 使用“With Clause”SQL Server 2008
- 23. SQL-ORDER BY in IF-ELSE CLAUSE
- 24. oracle 1 = 1 in join clause
- 25. 如何使用NOT IN CLAUSE
- 26. 更新使用WITH CLAUSE
- 27. 'Where clause'中的未知列''
- 28. SQL查询上存在CLAUSE
- 29. Mysql Group by clause帮助
- 30. gridview display + multiple where where clause
关键词是“sargable” – 2009-10-08 13:06:40