SQL Server上的LIKE和CONTAINS

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

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

SELECT * FROM table WHERE Contains(Column, "test");
1347548 次浏览

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

第一个查询,使用LIKE,将不能使用索引,因为它以通配符开始,所以总是需要全表扫描。


CONTAINS查询应该是:

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

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

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

CONTAINS还有一个聚集索引扫描,带有用于全文匹配的附加操作符和一个合并连接。

Plan

我认为CONTAINS花费了更长的时间并使用了Merge,因为您在查询adventure-works.com中有一个破折号(“-”)。

破折号是一个中断词,所以CONTAINS搜索全文索引的adventure,然后搜索works.com并合并结果。

也试着改变一下:

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

:

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

前者将找到值为“这是一个测试”和“一个测试用例就是计划”的记录。

后者还会找到值为“我正在测试这个”和“这是最棒的”的记录。

我不明白“包含”到底是怎么回事;关键字。我在一个列上设置了全文索引。我在表上运行一些查询。 Like返回450.518行但不包含,并且Like的结果是正确的

SELECT COL FROM TBL WHERE COL LIKE '%41%'  --450.518 rows
SELECT COL FROM TBL WHERE CONTAINS(COL,N'41')  ---40 rows
SELECT COL FROM TBL WHERE CONTAINS(COL,N'"*41*"') -- 220.364 rows