條件中的邏輯運算符 OR AND 和 WHERE 中的條件順序
讓我們檢查一下這兩個語句:
IF (CONDITION 1) OR (CONDITION 2) ... IF (CONDITION 3) AND (CONDITION 4) ...
如果
CONDITION 1
是TRUE
,會CONDITION 2
被檢查嗎?如果
CONDITION 3
是FALSE
,會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 不會像在其他程式語言中那樣進行短路,並且您無法強制它執行.
有關更多詳細資訊,請查看上述部落格條目中的第一個連結,該連結指向另一個部落格:
最終判決?好吧,我還沒有真正的,但可以肯定地說,唯一可以確保特定短路的情況是在 CASE 表達式中表達多個 WHEN 條件時。 使用標準布爾表達式,優化器將根據您正在查詢的表、索引和數據移動它認為合適的東西。