哪个SQL查询最好

时间:2019-04-10 13:51:49

标签: sql sql-server tsql indexing

我的应用程序中需要一个“搜索”功能,在SQL Server中执行此操作的最佳方法是什么?

  1. 使用OR语句创建包含1个包含所有列的大子句的查询,并创建1个包含所有列的索引。
SELECT *
FROM Customer
WHERE CustomerNumber LIKE '%' + @SearchValue +'%'
OR LastName LIKE '%' + @SearchValue +'%'
OR FirstName LIKE '%' + @SearchValue +'%'
OR
  1. 使用UNION为每列创建单独的查询,并为每列创建索引
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是唯一正确的解决方案?

对于您中的某些人来说,这似乎是一个非常简单的问题,但是我试图理解为什么需要这样做,所以总是欢迎您提供任何背景信息。

4 个答案:

答案 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 开头,因此他们将始终执行全表扫描。

第一个将执行单个全表扫描,而第二个将执行三个。因此,第一个会更快。

此外,请记住,第二个查询将返回略有不同的结果集,因为它会删除重复项。