下面哪个查询更快(LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
or
SELECT * FROM table WHERE Contains(Column, "test");
下面哪个查询更快(LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
or
SELECT * FROM table WHERE Contains(Column, "test");
当前回答
第二个(假设您指的是CONTAINS,并实际将其放入有效查询中)应该更快,因为它可以使用某种形式的索引(在本例中是全文索引)。当然,这种形式的查询仅在列位于全文索引中时可用。如果不是,那么只有第一种形式可用。
第一个查询,使用LIKE,将不能使用索引,因为它以通配符开始,所以总是需要全表扫描。
CONTAINS查询应该是:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
其他回答
第二个(假设您指的是CONTAINS,并实际将其放入有效查询中)应该更快,因为它可以使用某种形式的索引(在本例中是全文索引)。当然,这种形式的查询仅在列位于全文索引中时可用。如果不是,那么只有第一种形式可用。
第一个查询,使用LIKE,将不能使用索引,因为它以通配符开始,所以总是需要全表扫描。
CONTAINS查询应该是:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
在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;
前者将找到具有“这是一个测试”和“一个测试用例就是计划”这样值的记录。
后者还会找到具有“我正在测试这个”和“这是最棒的”这样值的记录。