2012-11-30 86 views
0

我曾以爲下面的第一個電話是更有效,因爲它不僅使該檢查一次,看是否@myInputParameter小於5000表現在這兩個SQL場景

如果檢查失敗,我避免完全查詢。不過,我已經看到其他人的代碼就像第二個例子一樣,說這個代碼效率很高,甚至更高。

誰能告訴我哪個更快?看起來第二個會慢很多,特別是如果這個調用正在梳理大數據集。

第一次調用:

IF (@myInputParameter < 5000) 
    BEGIN 
     SELECT 
      @myCount = COUNT(1) 
     FROM myTable 
     WHERE [email protected] 
      AND someOtherColumn='Hello' 

     --and so on 
    END 

第二個電話:

SELECT 
    @myCount = COUNT(1) 
FROM myTable 
WHERE [email protected] 
    AND someOtherColumn='Hello' 
    AND @myInputParameter < 5000 

--and so on 

編輯:我使用的是SQL Server 2008 R2的,但我真的問到感受一下它的查詢是「最佳實踐「。我敢肯定,這兩個陳述之間的查詢時間差異是千分之一秒,所以它不是那麼重要。我只是對編寫更好的SQL代碼感興趣。謝謝

回答

0

SQL Server設計良好。它將進行字面評估,如果不需要實際掃描表/索引。所以,我希望他們的表現基本一致。

從實踐的角度來看,我認爲應該使用if語句,特別是如果它包裝多個語句。但是,這實際上是對我的偏好問題。對我而言,無法執行的代碼在邏輯上會比沒有實際觸及數據時「應該」執行的代碼更快。

此外,SQL Server應該創建一個錯誤的計劃並實際執行命中數據的可能性。我從來沒有見過文字這個特定的場景,但我制定了不好的執行計劃。

1

有時,SQL Server很聰明,可以將後者轉換爲前者。這在一些計劃運算符(如過濾器或循環連接)中表現爲「啓動謂詞」。這會導致查詢在很短的時間內以非常快的速度進行評估。我剛剛測試了這個,順便說一句。

你不能依賴於所有的查詢,但一旦通過測試證明它適用於特定的查詢,我會依賴它。

如果使用OPTION (recompile),它會變得更可靠,因爲此選項將參數值內聯到查詢計劃中,從而導致整個查詢轉變爲恆定掃描。