2011-07-20 43 views
5

考慮以下情形:效率使用CASE WHEN ... IS NOT NULL VS ISNULL的/ COALESCE

  • 有三種類型的實體,說FooBarBaz
  • 每個Foo必須與BarBaz關聯,但不能同時關聯。

的情況下通過以下方式已經實現:

  • 有三個表:FooBarBaz
  • Foo有兩個外鍵字段:Bar_IDBaz_ID
  • 這些外鍵字段中的一個必須是NULL。現在

我想建立一個查詢顯示的Foo是清單,包括BarBaz每個Foo的描述相關聯。實際上,Bar的描述是Bar表中相應行的字段的相當複雜的公式。這同樣適用於Baz

我當前的查詢如下所示:

SELECT Foo.*, 
      CASE 
      WHEN Foo.Bar_ID IS NOT NULL THEN 
       -- a formula, say... 
       ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber 
      WHEN Foo.Baz_ID IS NOT NULL THEN 
       -- another formula, say... 
       ISNULL(Baz.Color + ' ', '') + Baz.Type 
      END AS 'Ba?Description' 
FROM  Foo 
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID 
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID 

是上次查詢更多,更少或比同樣有效......

SELECT Foo.*, 
      ISNULL(-- or COALESCE 
      ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber, 
      ISNULL(Baz.Color  + ' ', '') + Baz.Type 
     ) AS 'Ba?Description' 
FROM  Foo 
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID 
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID 

...?

回答

5

理論上,CASE應該是因爲只評估一個表達式。幾個鏈接的ISNULLs都將需要處理。

但是,你需要有一個大的(行10000S)數據集來發現任何區別:大多數處理進入實際的表訪問,連接等

你試過了嗎?您可以使用SQL分析器查看每個查詢的CPU等。

+0

我幾乎沒有要處理的數據,但我確實知道這將用於數據量與效率相關的環境中。 – pyon

+0

這是一個很好的觀點。我沒有考慮嵌套在ISNULL塊中的表達式的數量。 –

+0

+1 - 此外'NULL'處理通常非常快,所以肯定需要大量數據集才能顯示。 – JNK

1

我相信ISNULL更有效率。 CASE語句總是首先被評估,我相信限制查詢優化器可用的選項。

執行計劃說什麼?這是你真正的問題嗎?

1

COALESCEANSI函數,而ISNULLSQL Server專有函數。

它們在類型處理和其他一些方面不同,COALESCE可能接受兩個以上的參數。

對於您的任務(兩個參數,均爲VARCHAR),它們是等效的。