簡體   English   中英

選擇“where子句”評估順序

[英]Select "where clause" evaluation order

在 Sql Server 2005 中,當我有多個參數時,我能保證評估順序總是從左到右嗎?

使用示例:

select a from table where c=1 and d=2

在此查詢中,如果“c=1”條件失敗,則永遠不會評估“d=2”條件?

PS-“c”是一個整數索引列,d 是一個大型 varchar 且不可索引的列,需要全表掃描

更新我試圖避免執行兩個查詢或條件語句,我只需要類似的東西:如果“c 條件”失敗,有一種方法可以避免執行繁重的“d 條件”,因為在我的情況下不需要它。

無法保證評估順序。 優化器將嘗試使用可用信息找到執行查詢的最有效方式。

在您的情況下,由於 c 已編入索引而 d 未編入索引,因此優化器應查看索引以查找與 c 上的謂詞匹配的所有行,然后從表數據中檢索這些行以評估 d 上的謂詞。

但是,如果它確定 c 上的索引不是很有選擇性(盡管在您的示例中不是,gender 列很少被有用索引),它可能決定無論如何都要進行表掃描。

要確定執行順序,您應該獲得查詢的解釋計划。 但是,請意識到該計划可能會根據優化器認為的最佳查詢而改變。

SQL Server 將為它執行的每條語句生成一個優化的計划。 您無需訂購 where 子句即可獲得該好處。 您唯一的保證是它將按順序運行語句:

SELECT A FROM B WHERE C
SELECT D FROM E WHERE F

將在第二行之前運行第一行。

控制評估順序的一種方法是使用 CASE 表達式。

[編輯]

我試圖表達的流行觀點是:

您不能依賴表達式評估順序來處理諸如“WHERE OR”之類的事情,因為優化器可能會選擇一個在第一個謂詞之前評估第二個謂詞的計划。 但是 CASE 語句中表達式的求值順序是固定的,因此您可以依賴 CASE 語句的確定性短路求值。

它確實比下面網站中解釋的要復雜一些:

關聯

當我們引用的條件僅包含文字或常量時,就會完成短路。 因此,例如,假設我們有一個表 TableA,其中 num 列包含從 1 到 10 的所有正數,然后如果我編寫此查詢。

從 TableA 中選擇 num,其中 TableA.num < 0 AND 1/0 = 10。

這將導致錯誤。

編譯器是否足夠聰明,可以確定我的第二個子句由常量組成,所以它應該在評估需要從表或索引進行任何掃描的子句之前評估它?

您可以查看查詢的執行計划並確定它實際嘗試執行的操作。 我認為 SQL Server 的查詢引擎應該進行這種類型的掃描,並將其智能地轉換為操作。 就像,如果你做“昂貴的操作和假”,它會很快評估為假。

根據我了解到的情況,您輸入的內容(並且可能)與實際執行的內容不同。 你只是告訴服務器你期望什么類型的結果。 它如何獲得答案與您提供的代碼的從左到右無關。

如果您想確保可以檢查Query Execution Plan MSSQL 構建/優化的執行計划足夠聰明,可以在 varchar 列之前檢查索引列。

MS SQL Server 查詢優化器確實短路了,是的。 保證。

運行這個:

select 1 where 1 = 0 and 1 / 0 = 10

即使你被零除,它也會運行得很好並且不會出錯,因為查詢優化器會短路評估 where 子句。 這對您使用“and”並且其中一個和部分是常量的任何 where 子句都有影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM