我的应用程序中需要一个“搜索”功能,在SQL Server中执行此操作的最佳方法是什么?
SELECT *
FROM Customer
WHERE CustomerNumber LIKE '%' + @SearchValue +'%'
OR LastName LIKE '%' + @SearchValue +'%'
OR FirstName LIKE '%' + @SearchValue +'%'
OR
SELECT *
FROM Customer
WHERE CustomerNumber LIKE '%' + @SearchValue +'%'
UNION
SELECT *
FROM Customer
WHERE LastName LIKE '%' + @SearchValue +'%'
UNION
SELECT *
FROM Customer
WHERE FirstName LIKE '%' + @SearchValue +'%'
我已阅读到索引不支持OR语句?那么解决方案2是唯一正确的解决方案?
对于您中的某些人来说,这似乎是一个非常简单的问题,但是我试图理解为什么需要这样做,所以总是欢迎您提供任何背景信息。
答案 0 :(得分:3)
都不是最佳选择,但是第一个要好一些。它仅扫描一次数据,并且like
的评估会因与第一个或第二个条件匹配而短路。此外,union
会导致删除重复项的开销。
如果您确实想要性能,请研究数据库提供的全文索引选项。
答案 1 :(得分:1)
对于任何rdb来说,OR
条件无法优化通常是不正确的;大多数RDB都实现了AFAIK跳过索引,这意味着可以优化多范围条件。但是,在您的情况下,由于您的LIKE
条件以%
开头,因此不是前缀匹配,因此它们不能通过索引进行优化,因为它们不是范围条件。即使这样,您也应该使用OR
组合:它更易于阅读,符合查询的意图,并且UNION
查询很有可能会进行多次表扫描,每个子查询一次而OR查询可能会执行一次扫描,这应该更快。我之所以说“可能”,是因为使用理想的查询优化器,所有等效查询都应解析为最佳执行计划-在这种情况下,只需一次扫描。但是优化器远非“理想”。因此,当使用不同的rdb的YMMV时,请使用OR
查询。
但是对于这样的查询,如果要搜索单词,则应考虑使用全文索引(如果有),并且它们在大多数rdb中都可用,但是具有不同的查询语法。 https://www.mssqltips.com/sqlservertutorial/9136/sql-server-full-text-indexes/
答案 2 :(得分:1)
两个查询都无法达到最佳性能。
对于选项1-或正在扫描许多可能性,这并不是更好的方法。.实际上,您应该具有字符串索引以将所有选项组合在一起。
选项2-这比第一个选项要慢,因为它正在执行多个选择选项。
答案 3 :(得分:-1)
不用担心索引。
这些查询都不会使用任何索引。由于搜索模式以if $seconds = 482
$minutes = (482/60) % 60
$minutes = (8.03333333333333) % 60
开头,因此他们将始终执行全表扫描。
第一个将执行单个全表扫描,而第二个将执行三个。因此,第一个会更快。
此外,请记住,第二个查询将返回略有不同的结果集,因为它会删除重复项。