在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:

  1. 一个词或短语。
  2. 单词或短语的前缀。
  3. 在另一个词附近的一个词。
  4. 从另一个angular度产生的一个词(例如,drive这个词是驱动器的驱动器,驱动器,驱动器和驱动器的变形词)。
  5. 使用同义词词典(例如,“金属”一词可以具有诸如“铝”和“钢”的同义词的词)是另一个词的同义词。

注意:CONTAINS速度更快,如果有更新的全文索引,它将工作。 如果你想精确的正则expression式匹配,那么你可以使用像。

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

使用LIKE关键字的查询显示聚簇索引扫描。

CONTAINS还有一个聚簇索引扫描,其中包含用于全文匹配和合并连接的附加运算符。

计划

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

破折号是一个单词,所以CONTAINSsearchadventure的全文索引,并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.