2012-03-05 103 views
0

查询A和查询B之间是否存在任何性能差异?SQL Server Where子句使用In()vs Wildcard

查询

SELECT * FROM SomeTable 
WHERE 1 = 1 AND (SomeField LIKE '[1,m][6,e][n]%') 

查询乙

SELECT * FROM SomeTable 
WHERE 1 = 1 AND (SomeField IN ('16', 'Mens')) 
+5

首先,它们不是等价的。 – 2012-03-05 15:21:13

+1

为什么你用1 = 1? – vulkanino 2012-03-05 15:22:00

+0

@vulkanino:看到这里:http://stackoverflow.com/questions/242822/why-would-someone-use-where-1-1-and-conditions-in-a-sql-条款 – 2012-03-05 16:31:25

回答

5

第一可能是慢得多。除非有一个固定的前缀,否则索引不能与LIKE一起使用,例如LIKE 'foo%'。第一个查询将因此需要表扫描。然而,第二个查询可以使用SomeField上的索引(如果有)。

第一个查询也会给出错误的结果,因为它与'1en'匹配。

+0

+1你应该有一个博客让我们从你那里学习SQL :) – Sarfraz 2012-03-05 15:22:24

+1

@Mark:不应该让优化器足够聪明来认识到'c LIKE'Q [ab]%''可以使用索引吗?与'c LIKE'Qa%'或c LIKE'Qb%''相同吗? – 2012-03-05 15:23:29

+1

我的猜测是优化器只会在LIKE'Q [a-b]%'中使用Q的索引。 – Paparazzi 2012-03-05 16:31:20