2015-12-09 45 views
2

我搜索了很多這個簡單的操作。但我無法得到答案。我有一個簡單的查詢:SQL中的「AND」操作執行方法

select column1, column2... 
from table1 
where condition1 and condition2 and condition3 

上述查詢將返回一些行,如果所有條件都爲真。

我的問題是它是否會給結果作爲「不及格」,一旦它找到的第一個條件(條件1)失敗?

操作的其餘部分的執行意味着少,如果第二和第三個條件有巨大的操作會花費更多的時間。

您能解釋一下這個操作嗎?

+4

這取決於優化,但你可以信任它,它就會明白,當已經失敗,首先是不必要的評估多個條件。即使[條件的順序應該是無關的](http://stackoverflow.com/questions/11436469/does-order-of-where-clauses-matter-in-sql)。 –

+2

[在SQL Server布爾運算符短路](http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/) - [不依賴表達式short在T-SQL中循環](http://blogs.msdn.com/b/bartd/archive/2011/03/03/don-t-depend-on-expression-short-circuiting-in-t-sql-not -even-with-case.aspx) –

回答

3

,你指的是操作是短路。據我所知,大多數SQL數據庫都實現了這一點。也就是說,當where條件的結果已知時,他們停止評估子句。

這配備了一個警告,雖然:他們不保證評價的順序。所以,優化器可能會以任何順序對它們進行評估。注意:你不應該擔心簡單的比較。性能的唯一問題是使用函數(或長字符串上的like表達式),尤其是用戶定義的函數。

如果你覺得你比優化器(這是很可能的)更聰明,你可以使用case

where (case when not (condition1) then 0 
      when not (condition2) then 0 
      when not (condition3) then 0 
      else 1 
     end) = 1 

不過,我會鼓勵這樣的兩個關鍵原因:

  • 它阻止優化器使用索引。
  • 該代碼不太容易理解。

一般來說,這些類型的優化是不是對查詢性能很重要。其他問題,例如具有明確定義的索引和適當的數據類型通常更重要。