2012-01-13 80 views
1

我不知道這是不是合適的論壇。可以說我有以下內容:SQL查詢:布爾處理

SELECT * 
FROM MyTable m 
WHERE ((A OR B) AND (C OR D)) 

假設A,B,C,d是適當的布爾子句,每個需要上的行級基礎上進行評價。讓我們也假設沒有索引。

這是邏輯上等同於:

SELECT * 
FROM MyTable m 
WHERE (A AND C) 
    OR (A AND D) 
    OR (B AND C) 
    OR (B AND D) 

是否有性能上的優勢,以一方?我們正在使用MSSql-2008。

+0

Intersting question - +1 – XIVSolutions 2012-01-13 04:24:55

+0

查詢優化器保留所有權利隨機播放。根據統計數據和指標,它可能會做出一些意想不到的事也就是說,我會隨着你的第一個例子走,因爲它對休閒讀者來說似乎更清楚。 – HABO 2012-01-13 14:20:17

+0

用例實際上是用於生成的SQL,因此除了相對罕見的調試外,用戶不會看到它。 – Shlomo 2012-01-13 15:50:35

回答

1

我的理解是,你的第一種情況是更有效,因爲:

這一條款

: WHERE((A或B)和(C或d))

整個語句,如果失敗,既不A或B是真的;聲明的第二部分(C或D)未被評估。即使A或B爲真,也只有一對要檢查 - C或D.最壞的情況是,在整個語句之前可以評估四個標準,如果A = False,B = False,C =假,但D =真)。最好的情況是,在僅檢查A和B之後,該語句變爲假。如果兩個都不成立,則整個語句是錯誤的。

在第二種情況下,必須對所有四種情況進行全部評估,才能對整個聲明進行評估。

在AND內部嵌套OR條件意味着如果第一種情況失敗,更多的情況下,這裏沒有更多的關注。如果您將最有可能成爲錯誤的情況作爲第一對,您可以進一步改進。

我會很樂意聽到別人對此的評論。 。 。

+1

所以最好的例子是A:False + B:False,只有兩個評價。在這種情況下,第二條語句也只評估A + B。它們在邏輯上是等價的,所以如果SQL Server足夠聰明,就不會有區別。這是我假設正確的答案。 – Shlomo 2012-01-13 02:48:22

+0

我的好奇心是每次重新評估'A'... – Shlomo 2012-01-13 02:49:53

+0

我同意他們在邏輯上是相等的,但我相信操作順序(如括號所示)對一些編譯器而不是其他人是重要的。我同意 - 我也有興趣知道A是否在情況2中每次評估。 – XIVSolutions 2012-01-13 04:24:28