LIKE vs SQL Server上的CONTAINS

时间:2011-09-22 06:45:11

标签: sql-server performance contains sql-like

以下哪个查询更快(LIKE vs CONTAINS)?

SELECT * FROM table WHERE Column LIKE '%test%';

SELECT * FROM table WHERE Contains(Column, "test");

5 个答案:

答案 0 :(得分:145)

第二个(假设你的意思是CONTAINS,实际上把它放在一个有效的查询中)应该更快,因为它可以使用一些形式的索引(在这种情况下,一个完整的文字索引)。当然,这种形式的查询只有如果列在全文索引中。如果不是,那么只有第一种形式可用。

使用LIKE的第一个查询将无法使用索引,因为它以通配符开头,因此始终需要进行全表扫描。


CONTAINS查询应为:

SELECT * FROM table WHERE CONTAINS(Column, 'test');

答案 1 :(得分:23)

CONTAINS搜索与单个单词和短语,彼此相距一定距离内的单词或SQL Server中的加权匹配的精确或模糊(不太精确)匹配。

CONTAINS可以搜索:

  1. 一个单词或短语。
  2. 单词或短语的前缀。
  3. 靠近另一个词的一个词。
  4. 从另一个词中生成的一个词(例如,词驱动器是驱动器,驱动器,驱动器和驱动器的弯曲杆)。
  5. 一个单词,是使用同义词库的另一个单词的同义词(例如,单词" metal"可以有同义词,如"铝和#34;和"钢" ;)
  6. 注意:CONTAINS更快,如果有更新的全文索引,它将起作用。如果你想要精确的正则表达式匹配,那么你可以使用like。

答案 2 :(得分:13)

在SQL Server 2012实例上运行两个查询后,我可以确认第一个查询在我的情况下最快。

LIKE关键字的查询显示了聚集索引扫描。

CONTAINS还有一个聚集索引扫描,其中包含全文匹配和合并连接的附加运算符。

Plan

答案 3 :(得分:5)

我认为CONTAINS需要更长的时间并使用Merge,因为您在查询adventure-works.com中有一个短划线(" - ")。

短划线是一个中断词,因此CONTAINS搜索了adventure的全文索引,而不是搜索works.com并合并了结果。

答案 4 :(得分:4)

还可以尝试改变:

    SELECT * FROM table WHERE Contains(Column, "test") > 0;

对此:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;

前者会找到值为" 这是测试的记录"和" 测试用例是计划"。

后者还会查找记录值为" 我正在测试此"和" 这是最伟大的"。