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

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

or

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

当前回答

我不明白"包含"这个关键字到底是怎么回事。我在一个列上设置了全文索引。我在表上运行一些查询。 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

其他回答

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

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

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

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

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

我不明白"包含"这个关键字到底是怎么回事。我在一个列上设置了全文索引。我在表上运行一些查询。 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

也试着改变一下:

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

:

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

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

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

第二个(假设您指的是CONTAINS,并实际将其放入有效查询中)应该更快,因为它可以使用某种形式的索引(在本例中是全文索引)。当然,这种形式的查询仅在列位于全文索引中时可用。如果不是,那么只有第一种形式可用。

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


CONTAINS查询应该是:

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