在SQL Server上使用LIKE和CONTAINS
以下哪个查询更快(LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
要么
SELECT * FROM table WHERE Contains(Column, "test");
第二种(假设你的意思是CONTAINS
,实际上把它放在一个有效的查询中)应该会更快,因为它可以使用某种forms的索引(在本例中是全文索引)。 当然,这种查询forms只有在列是全文索引时才可用。 如果不是,那么只有第一种forms可用。
使用LIKE的第一个查询将无法使用索引,因为它以通配符开头,所以总是需要全表扫描。
CONTAINS
查询应该是:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINSsearch精确或模糊(不太精确)的匹配单个单词和短语,相互之间的一定距离内的单词,或SQL Server中的加权匹配。
CONTAINS可以search:
- 一个词或短语。
- 单词或短语的前缀。
- 在另一个词附近的一个词。
- 从另一个angular度产生的一个词(例如,drive这个词是驱动器的驱动器,驱动器,驱动器和驱动器的变形词)。
- 使用同义词词典(例如,“金属”一词可以具有诸如“铝”和“钢”的同义词的词)是另一个词的同义词。
注意:CONTAINS速度更快,如果有更新的全文索引,它将工作。 如果你想精确的正则expression式匹配,那么你可以使用像。
在SQL Server 2012实例上运行这两个查询之后,我可以确认第一个查询在我的情况下是最快的。
使用LIKE
关键字的查询显示聚簇索引扫描。
CONTAINS
还有一个聚簇索引扫描,其中包含用于全文匹配和合并连接的附加运算符。
我认为CONTAINS
花了更长的时间,并使用Merge
因为你在查询adventure-works.com
有一个破折号(“ – ”)。
破折号是一个单词,所以CONTAINS
searchadventure
的全文索引,并searchworks.com
并合并结果。
也请尝试改变:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
对此:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
前者会find像“ 这是一个testing ”和“ testing用例就是计划 ” 这样的值的logging。
后者也会find像“ 我正在testing这个 ”和“ 这是最大的 ”值的logging。
我们可以在任何列上应用LIKE条件,而不validation列是INDEXED列还是不是。
但是,CONTAINS条件只能应用于INDEXED列。 如果我们试图在非INDEXED列上应用,我们将得到下面的错误。
ORA-20000: Oracle Text error: DRG-10599: column is not indexed 20000. 00000 - "%s" *Cause: The stored procedure 'raise_application_error' was called which causes this error to be generated. *Action: Correct the problem as described in the error message or contact the application administrator or DBA for more information.