2009-07-11 44 views
1
SELECT 
    * 
FROM 
    myTable 
WHERE 
    field1 LIKE 'match0' AND 
    myfunc(t1.hardwareConfig) LIKE 'match1' 

這裏是我的問題,這背後的查詢,的SQL Server將如何執行場景

FIELD1的匹配速度快,見效快,但MYFUNC需要永遠回,我要確保,如果FIELD1沒有按它不符合它甚至不嘗試執行myfunc。

SQL會知道這一點嗎?或者我可以在我的查詢中明確這一點嗎?

我在MSSQL 2000,2005和2008年,希望有一個共同的答案。

+1

什麼是mysp?它不能是一個存儲過程,因爲你不能以這種方式使用它們。 – 2009-07-11 23:37:09

回答

7

要強制評估條件的順序,請使用以下方法,因爲它記錄了CASE保留評估條件的順序。

SELECT 
     * 
FROM 
     myTable 
WHERE 
    CASE WHEN field1 LIKE 'match0' THEN 
    CASE WHEN myfunc(t1.hardwareConfig) LIKE 'match1' 
     THEN 1 
    END 
    END = 1 

下面的文章解釋了其良好的細節:Predicates in SQL

1

有很多事情在幕後進行,以確定如何執行查詢,但在這種情況下,我會期望它首先篩選field1。請注意,這不是保證 - 查詢優化器現在可以做出一些奇怪的選擇。此外,通過使用'='運算符而不是'LIKE'運算符,可以提高您的機會。

1

mysp不能是存儲過程。它必須是用戶定義的函數(順便說一下,您應該使用其模式名稱進行限定)。用戶定義的功能被限制爲無副作用,並應遵守一些規則。本質上,SQL Server將結合查詢並將其作爲單個模塊與單個執行計劃一起執行。這不是你可能期望的程序性函數調用。 SQL描述了要做什麼,而不是如何去做,而查詢優化器將生成一個響應完整查詢的計劃,而不是單獨的每個部分。觀點也是如此。

1

在SQL Server Management Studio中(對於2008,我認爲是2005),可以告訴它向您顯示執行計劃。在查詢窗口中按下Control-M。然後執行查詢。這會告訴你細節。

0

myfunc只是一個複雜的計算或不返回值變動頻繁。我想知道,如果它不經常更改,而且這是一個頻繁執行的查詢,那麼可能會更好地設計一個後插入觸發器來計算值並將其作爲單獨的列存儲在表中。然後,您不必擔心評估事物的順序。查詢甚至可能運行得更快,特別是如果您在兩列上都有索引。