Sql-Server

條件中的邏輯運算符 OR AND 和 WHERE 中的條件順序

  • September 4, 2019

讓我們檢查一下這兩個語句:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

如果CONDITION 1TRUE,會CONDITION 2被檢查嗎?

如果CONDITION 3FALSE,會CONDITION 4被檢查嗎?

條件如何WHERE:SQL Server 引擎是否優化WHERE子句中的所有條件?程序員是否應該按正確的順序放置條件以確保 SQL Server 優化器以正確的方式解決它?

添加:

感謝 Jack 的連結,來自 t-sql 程式碼的驚喜:

IF  1/0 = 1 OR 1 = 1
     SELECT 'True' AS result
ELSE
     SELECT 'False' AS result


IF  1/0 = 1 AND 1 = 0
     SELECT 'True' AS result
ELSE
     SELECT 'False' AS result

在這種情況下,不會引發除以零異常。

結論:

如果 C++/C#/VB 有短路,為什麼 SQL Server 不能有它?

要真正回答這個問題,讓我們來看看兩者是如何在條件下工作的。C++/C#/VB 都在語言規範中定義了短路以加速程式碼執行。為什麼要在第一個已經為真時評估 N OR 條件或在第一個已經為假時評估 M AND 條件。

作為開發人員,我們必須意識到 SQL Server 的工作方式不同。這是一個基於成本的系統。為了獲得我們查詢的最佳執行計劃,查詢處理器必須評估每個 where 條件並為其分配成本。然後將這些成本作為一個整體進行評估,以形成一個門檻值,該門檻值必須低於 SQL Server 為一個好的計劃而定義的門檻值。如果成本低於定義的門檻值,則使用計劃,如果不是,則使用不同的條件成本組合再次重複整個過程。這裡的成本是掃描或查找或合併連接或雜湊連接等……因此,C++/C#/VB 中可用的短路是不可能的。您可能認為在列上強制使用索引算作短路,但事實並非如此。它只強制使用該索引,從而縮短可能的執行計劃列表。該系統仍然基於成本。

作為開發人員,您必須意識到 SQL Server 不會像在其他程式語言中那樣進行短路,並且您無法強制它這樣做。

SQL Server 不能保證語句是否或以何種順序在WHERE子句中處理。允許語句短路的單個表達式是CASE- WHEN。以下來自我在 Stackoverflow 上發布的答案:

SQL Server 如何短路 WHERE 條件評估

它會在你喜歡的時候出現,但不是你立即想到的方式。

作為開發人員,您必須知道SQL Server 不會像在其他程式語言中那樣進行短路,並且您無法強制它執行.

有關更多詳細資訊,請查看上述部落格條目中的第一個連結,該連結指向另一個部落格:

SQL Server 是否短路?

最終判決?好吧,我還沒有真正的,但可以肯定地說,唯一可以確保特定短路的情況是在 CASE 表達式中表達多個 WHEN 條件時。 使用標準布爾表達式,優化器將根據您正在查詢的表、索引和數據移動它認為合適的東西。

引用自:https://dba.stackexchange.com/questions/5333