LIKE vs SQL Server上的CONTAINS

use*_*429 190 sql-server performance contains sql-like

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

SELECT * FROM table WHERE Column LIKE '%test%';
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM table WHERE Contains(Column, "test");
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 156

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

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


CONTAINS查询应该是:

SELECT * FROM table WHERE CONTAINS(Column, 'test');
Run Code Online (Sandbox Code Playgroud)


小智 13

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

带有LIKE关键字的查询显示了聚簇索引扫描.

CONTAINS还与对全文匹配和合并连接额外的运营商聚集索引扫描.

计划

  • 聚集索引叶页*是*表.带有前导通配符的`LIKE`查询将无法有效地使用索引部分.它需要只扫描整个事情.毫无疑问,在某些情况下,完整的CI扫描比使用全文索引的查询表现更好(例如,如果行的匹配比例非常高),这很大程度上是例外,而不是一些一般规则,你可以确认". (8认同)

小智 6

也可以尝试从此更改:

    SELECT * FROM table WHERE Contains(Column, "test") > 0;
Run Code Online (Sandbox Code Playgroud)

对此:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
Run Code Online (Sandbox Code Playgroud)

前者将查找具有“ 这是一个测试 ”和“ 一个测试用例是计划 ”之类的值的记录。

后者还将找到诸如“ 我正在测试 ”和“ 这是最大的 ” 等值的记录。

  • 在搜寻字词前后加上星号是否有效?在阅读“ CONTAINS”的文档时,它仅提及使用诸如“ test *”之类的前缀术语,而不提及诸如“ * test”之类的后缀术语以及诸如“ * test *”之类的全子串搜索。我还没有尝试过。 (3认同)
  • 如果您阅读了CONTAINS的文档(https://docs.microsoft.com/zh-cn/sql/t-sql/queries/contains-transact-sql),则仅支持搜索前缀。我已经尝试了无数次,并且无法通过Contains(Column,'“ * test *”')找到“这是最大的”(在SQL Server中) (3认同)

小智 5

我认为这CONTAINS需要更长时间并且Merge因为你在查询中有一个短划线(" - ")adventure-works.com.

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