我有一个查询,我正在对几个子查询进行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';
答案 0 :(得分:2)
需要考虑多个方面:
index
:在此上下文中无关紧要,查询将通过执行聚簇索引扫描或表扫描来执行相同的操作。 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'
情景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'
答案 1 :(得分:1)
由于您从性能角度提问 - 其他选项(如contains和freetext)可能会表现得更好。请参阅http://msdn.microsoft.com/en-us/library/ms187787.aspx和http://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索引扫描而不是表扫描。如果没有索引,那么它们将大致相同,因为它们都需要进行表扫描。
至于添加全文索引的想法,这对于长列文本最好,而不是像这样的短名称。如果您需要性能并进行一系列精确匹配,我会坚持使用索引列。