我应该在SQL Server中使用OR语句或LIKE语句吗?

时间:2012-11-27 20:49:15

标签: sql sql-server

我有一个查询,我正在对几个子查询进行INNER JOIN。在这个查询中,我使用了一个类似的WHERE子句,它有一个LIKE语句; WHERE bookName LIKE '%INTERVIEWS%'

但是bookName有五种不同的变体,其中有“访谈”一词。如果我为每个变体做了OR语句,那么查询的效果会更好,还是应该为所有变体做一个LIKE语句?

------------------编辑------------------

以下是仅使用LIKE语句查询的示例:

SELECT 
   *
FROM 
   books
WHERE
   bookName LIKE '%INTERVIEWS%';

以下是使用OR语句查询的示例:

SELECT 
   *
FROM 
   books
WHERE
   bookName = 'INTERVIEWS WITH CELEBRITIES'
   OR
   bookName = 'ONGOING INTERVIEWS WITH STUDENTS'
   OR
   bookName = 'POLITICIAN INTERVIEWS'
   OR
   bookName = 'INTERVIEWS WHICH FAILED'
   OR
   bookName = 'INTERVIEWS WITH PROGRAMMERS';

3 个答案:

答案 0 :(得分:2)

需要考虑多个方面:

  • bookName列上没有index:在此上下文中无关紧要,查询将通过执行聚簇索引扫描或表扫描来执行相同的操作。
  • bookName列上有non clustered index
    • 这是non covering index(方案1): 在使用OR语句的第二个用例中,您可能会遇到index tipping point,其中查询优化程序将决定来使用non clustered index。在此上下文中,LIKE将通过使用索引扫描更好地执行。详细了解Kimberly Tripp's blog
    • 这是covering index(方案2): 覆盖索引没有临界点。在这种情况下,使用index seek LIKE查询仍然必须执行Index Scan时,第二个查询的效果会更好。

因此,如果性能至关重要,请使用覆盖索引

以下是使用Adventure Works

的详细信息

情景1

SELECT  *
FROM    Production.Product AS p
WHERE   Name LIKE '%mountain seat%'

SELECT  *
FROM    Production.Product AS p
WHERE   Name = 'LL Mountain Seat Assembly'
        OR Name = 'ML Mountain Seat Assembly'
        OR Name = 'HL Mountain Seat Assembly'
        OR Name = 'LL Mountain Seat/Saddle'
        OR Name = 'ML Mountain Seat/Saddle'
        OR Name = 'HL Mountain Seat/Saddle'

enter image description here

情景2

SELECT  Name
FROM    Production.Product AS p
WHERE   Name LIKE '%mountain seat%'

SELECT  Name
FROM    Production.Product
WHERE   Name = 'LL Mountain Seat Assembly'
        OR Name = 'ML Mountain Seat Assembly'
        OR Name = 'HL Mountain Seat Assembly'
        OR Name = 'LL Mountain Seat/Saddle'
        OR Name = 'ML Mountain Seat/Saddle'
        OR Name = 'HL Mountain Seat/Saddle'

enter image description here

答案 1 :(得分:1)

由于您从性能角度提问 - 其他选项(如contains和freetext)可能会表现得更好。请参阅http://msdn.microsoft.com/en-us/library/ms187787.aspxhttp://msdn.microsoft.com/en-us/library/ms176078.aspx

假设您正在开发的场景是用户搜索页面,自由文本可能是SQL Server更好的开箱即用选项,因为它支持词干(即面试搜索包括访谈,访谈,访问者,等等。)。除其他外,它还支持词库匹配。

可以使用其他非SQL Server选项,但进入门槛较高,例如Lucene / SOLR。

编辑: contains和freetext(或containsstable和freetexttable)入门要求您在数据库中启用全文索引。有关入门信息,请参阅http://technet.microsoft.com/en-us/library/ms142497.aspx

答案 2 :(得分:0)

如果bookName列已编制索引并且该表具有大量列,则第二个选项肯定会更快地运行,因为它将是ab索引扫描而不是表扫描。如果没有索引,那么它们将大致相同,因为它们都需要进行表扫描。

至于添加全文索引的想法,这对于长列文本最好,而不是像这样的短名称。如果您需要性能并进行一系列精确匹配,我会坚持使用索引列。