2012-03-05 142 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