1

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

但是大约有五种不同的变体,bookName其中包含“INTERVIEWS”一词。那么,如果我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';
4

3 回答 3

3

有多个方面需要考虑:

  • 您没有index关于 bookName 列:在此无关紧要的上下文中,查询将通过执行聚集索引扫描或表扫描以相同的方式执行。
  • non clustered index在 bookName 列上 有一个
    • 这是一个non covering index(场景 1):在带有语句的第二个用例中OR,您可能会遇到index tipping point,查询优化器将决定使用non clustered index. 在这种情况下LIKE,使用索引扫描会表现得更好。在Kimberly Tripp 的博客上阅读更多内容。
    • 这是一个covering index(场景 2):覆盖索引没有临界点。在这种情况下,第二个查询将通过使用index seekwhereLIKE查询仍然必须执行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'

在此处输入图像描述

方案 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'

在此处输入图像描述

于 2012-11-27T22:45:57.297 回答
1

由于您是从性能角度询问 - 其他选择(例如包含和自由文本)可能会表现更好。请参阅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(或 containstable 和 freetexttable)需要您在数据库中启用全文索引。有关一些入门信息,请参阅http://technet.microsoft.com/en-us/library/ms142497.aspx 。

于 2012-11-27T20:55:06.027 回答
0

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

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

于 2012-11-27T21:22:30.283 回答